logdetective 2.4.1__py3-none-any.whl → 2.5.0__py3-none-any.whl

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.
@@ -13,6 +13,7 @@ from sqlalchemy import (
13
13
  ForeignKey,
14
14
  UniqueConstraint,
15
15
  desc,
16
+ select,
16
17
  )
17
18
  from sqlalchemy.orm import relationship
18
19
  from sqlalchemy.engine import Row
@@ -70,7 +71,7 @@ class GitlabMergeRequestJobs(Base):
70
71
 
71
72
  @classmethod
72
73
  @backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
73
- def create(
74
+ async def create(
74
75
  cls,
75
76
  forge: Forge,
76
77
  project_id: int,
@@ -86,28 +87,30 @@ class GitlabMergeRequestJobs(Base):
86
87
  mr_iid: merge request forge iid
87
88
  job_id: forge job id
88
89
  """
89
- with transaction(commit=True) as session:
90
+ async with transaction(commit=True) as session:
90
91
  mr = cls()
91
92
  mr.forge = forge
92
93
  mr.project_id = project_id
93
94
  mr.mr_iid = mr_iid
94
95
  mr.job_id = job_id
95
96
  session.add(mr)
96
- session.flush()
97
+ await session.flush()
97
98
  return mr.id
98
99
 
99
100
  @classmethod
100
- def get_by_id(
101
+ async def get_by_id(
101
102
  cls,
102
103
  id_: int,
103
104
  ) -> Optional["GitlabMergeRequestJobs"]:
104
105
  """Search for a given PostgreSQL id"""
105
- with transaction(commit=False) as session:
106
- mr = session.query(cls).filter_by(id=id_).first()
106
+ query = select(cls).where(cls.id == id_)
107
+ async with transaction(commit=False) as session:
108
+ query_result = await session.execute(query)
109
+ mr = query_result.scalars().first()
107
110
  return mr
108
111
 
109
112
  @classmethod
110
- def get_by_details(
113
+ async def get_by_details(
111
114
  cls,
112
115
  forge: Forge,
113
116
  project_id: int,
@@ -122,36 +125,34 @@ class GitlabMergeRequestJobs(Base):
122
125
  mr_iid: merge request forge iid
123
126
  job_id: forge job id
124
127
  """
125
- with transaction(commit=False) as session:
126
- mr = (
127
- session.query(cls)
128
- .filter_by(
129
- forge=forge, project_id=project_id, mr_iid=mr_iid, job_id=job_id
130
- )
131
- .first()
132
- )
128
+ query = select(cls).where(
129
+ cls.forge == forge,
130
+ cls.project_id == project_id,
131
+ cls.mr_iid == mr_iid,
132
+ cls.job_id == job_id,
133
+ )
134
+ async with transaction(commit=False) as session:
135
+ query_result = await session.execute(query)
136
+ mr = query_result.scalars().first()
133
137
  return mr
134
138
 
135
139
  @classmethod
136
- def get_by_mr_iid(
137
- cls, forge: Forge, project_id: int, mr_iid
138
- ) -> List[Self]:
140
+ async def get_by_mr_iid(cls, forge: Forge, project_id: int, mr_iid) -> List[Self]:
139
141
  """Get all the mr jobs saved for the specified mr iid and project id."""
140
- with transaction(commit=False) as session:
141
- comments = (
142
- session.query(cls)
143
- .filter(
144
- GitlabMergeRequestJobs.forge == forge,
145
- GitlabMergeRequestJobs.project_id == project_id,
146
- GitlabMergeRequestJobs.mr_iid == mr_iid,
147
- )
148
- .all()
149
- )
142
+ query = select(cls).where(
143
+ GitlabMergeRequestJobs.forge == forge,
144
+ GitlabMergeRequestJobs.project_id == project_id,
145
+ GitlabMergeRequestJobs.mr_iid == mr_iid,
146
+ )
147
+
148
+ async with transaction(commit=False) as session:
149
+ query_result = await session.execute(query)
150
+ comments = query_result.scalars().all()
150
151
 
151
152
  return comments
152
153
 
153
154
  @classmethod
154
- def get_or_create(
155
+ async def get_or_create(
155
156
  cls,
156
157
  forge: Forge,
157
158
  project_id: int,
@@ -167,10 +168,12 @@ class GitlabMergeRequestJobs(Base):
167
168
  mr_iid: merge request forge iid
168
169
  job_id: forge job id
169
170
  """
170
- mr = GitlabMergeRequestJobs.get_by_details(forge, project_id, mr_iid, job_id)
171
+ mr = await GitlabMergeRequestJobs.get_by_details(
172
+ forge, project_id, mr_iid, job_id
173
+ )
171
174
  if mr is None:
172
- id_ = GitlabMergeRequestJobs.create(forge, project_id, mr_iid, job_id)
173
- mr = GitlabMergeRequestJobs.get_by_id(id_)
175
+ id_ = await GitlabMergeRequestJobs.create(forge, project_id, mr_iid, job_id)
176
+ mr = await GitlabMergeRequestJobs.get_by_id(id_)
174
177
  return mr
175
178
 
176
179
 
@@ -197,7 +200,9 @@ class Comments(Base):
197
200
  comment="The comment gitlab id",
198
201
  )
199
202
  created_at = Column(
200
- DateTime, nullable=False, comment="Timestamp when the comment was created"
203
+ DateTime(timezone=True),
204
+ nullable=False,
205
+ comment="Timestamp when the comment was created",
201
206
  )
202
207
 
203
208
  __table_args__ = (
@@ -209,7 +214,7 @@ class Comments(Base):
209
214
 
210
215
  @classmethod
211
216
  @backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
212
- def create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
217
+ async def create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
213
218
  cls,
214
219
  forge: Forge,
215
220
  project_id: int,
@@ -230,8 +235,8 @@ class Comments(Base):
230
235
  job_id: forge job id
231
236
  comment_id: forge comment id
232
237
  """
233
- with transaction(commit=True) as session:
234
- mr_job = GitlabMergeRequestJobs.get_or_create(
238
+ async with transaction(commit=True) as session:
239
+ mr_job = await GitlabMergeRequestJobs.get_or_create(
235
240
  forge, project_id, mr_iid, job_id
236
241
  )
237
242
 
@@ -245,21 +250,23 @@ class Comments(Base):
245
250
  comment.created_at = datetime.datetime.now(datetime.timezone.utc)
246
251
  comment.merge_request_job_id = mr_job.id
247
252
  session.add(comment)
248
- session.flush()
253
+ await session.flush()
249
254
  return comment.id
250
255
 
251
256
  @classmethod
252
- def get_by_id(
257
+ async def get_by_id(
253
258
  cls,
254
259
  id_: int,
255
260
  ) -> Optional["Comments"]:
256
261
  """Search for a given PostgreSQL id"""
257
- with transaction(commit=False) as session:
258
- comment = session.query(cls).filter_by(id=id_).first()
262
+ query = select(cls).where(cls.id == id_)
263
+ async with transaction(commit=False) as session:
264
+ query_result = await session.execute(query)
265
+ comment = query_result.scalars().first()
259
266
  return comment
260
267
 
261
268
  @classmethod
262
- def get_by_gitlab_id(
269
+ async def get_by_gitlab_id(
263
270
  cls,
264
271
  forge: Forge,
265
272
  comment_id: str,
@@ -271,24 +278,21 @@ class Comments(Base):
271
278
  forge: forge name
272
279
  comment_id: forge comment id
273
280
  """
274
- with transaction(commit=False) as session:
275
- comment = (
276
- session.query(cls)
277
- .join(
278
- GitlabMergeRequestJobs,
279
- cls.merge_request_job_id == GitlabMergeRequestJobs.id,
280
- )
281
- .filter(
282
- GitlabMergeRequestJobs.forge == forge,
283
- cls.comment_id == comment_id,
284
- )
285
- .first()
281
+ query = (
282
+ select(cls)
283
+ .join(
284
+ GitlabMergeRequestJobs,
285
+ cls.merge_request_job_id == GitlabMergeRequestJobs.id,
286
286
  )
287
-
287
+ .filter(GitlabMergeRequestJobs.forge == forge, cls.comment_id == comment_id)
288
+ )
289
+ async with transaction(commit=False) as session:
290
+ query_result = await session.execute(query)
291
+ comment = query_result.scalars().first()
288
292
  return comment
289
293
 
290
294
  @classmethod
291
- def get_latest_comment(
295
+ async def get_latest_comment(
292
296
  cls,
293
297
  forge: Forge,
294
298
  project_id: int,
@@ -301,26 +305,26 @@ class Comments(Base):
301
305
  project_id: forge project id
302
306
  mr_iid: merge request forge iid
303
307
  """
304
- with transaction(commit=False) as session:
305
- comment = (
306
- session.query(cls)
307
- .join(
308
- GitlabMergeRequestJobs,
309
- cls.merge_request_job_id == GitlabMergeRequestJobs.id,
310
- )
311
- .filter(
312
- GitlabMergeRequestJobs.forge == forge,
313
- GitlabMergeRequestJobs.project_id == project_id,
314
- GitlabMergeRequestJobs.mr_iid == mr_iid,
315
- )
316
- .order_by(desc(cls.created_at))
317
- .first()
308
+ query = (
309
+ select(cls)
310
+ .join(
311
+ GitlabMergeRequestJobs,
312
+ cls.merge_request_job_id == GitlabMergeRequestJobs.id,
318
313
  )
319
-
314
+ .filter(
315
+ GitlabMergeRequestJobs.forge == forge,
316
+ GitlabMergeRequestJobs.project_id == project_id,
317
+ GitlabMergeRequestJobs.mr_iid == mr_iid,
318
+ )
319
+ .order_by(desc(cls.created_at))
320
+ )
321
+ async with transaction(commit=False) as session:
322
+ query_result = await session.execute(query)
323
+ comment = query_result.scalars().first()
320
324
  return comment
321
325
 
322
326
  @classmethod
323
- def get_mr_comments(
327
+ async def get_mr_comments(
324
328
  cls,
325
329
  forge: Forge,
326
330
  project_id: int,
@@ -333,26 +337,26 @@ class Comments(Base):
333
337
  project_id: forge project id
334
338
  mr_iid: merge request forge iid
335
339
  """
336
- with transaction(commit=False) as session:
337
- comments = (
338
- session.query(cls)
339
- .join(
340
- GitlabMergeRequestJobs,
341
- cls.merge_request_job_id == GitlabMergeRequestJobs.id,
342
- )
343
- .filter(
344
- GitlabMergeRequestJobs.forge == forge,
345
- GitlabMergeRequestJobs.project_id == project_id,
346
- GitlabMergeRequestJobs.mr_iid == mr_iid,
347
- )
348
- .order_by(desc(cls.created_at))
349
- .all()
340
+ query = (
341
+ select(cls)
342
+ .join(
343
+ GitlabMergeRequestJobs,
344
+ cls.merge_request_job_id == GitlabMergeRequestJobs.id,
350
345
  )
351
-
346
+ .filter(
347
+ GitlabMergeRequestJobs.forge == forge,
348
+ GitlabMergeRequestJobs.project_id == project_id,
349
+ GitlabMergeRequestJobs.mr_iid == mr_iid,
350
+ )
351
+ .order_by(desc(cls.created_at))
352
+ )
353
+ async with transaction(commit=False) as session:
354
+ query_result = await session.execute(query)
355
+ comments = query_result.scalars().all()
352
356
  return comments
353
357
 
354
358
  @classmethod
355
- def get_or_create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
359
+ async def get_or_create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
356
360
  cls,
357
361
  forge: Forge,
358
362
  project_id: int,
@@ -370,40 +374,31 @@ class Comments(Base):
370
374
  job_id: forge job id
371
375
  comment_id: forge comment id
372
376
  """
373
- comment = Comments.get_by_gitlab_id(forge, comment_id)
377
+ comment = await Comments.get_by_gitlab_id(forge, comment_id)
374
378
  if comment is None:
375
- id_ = Comments.create(forge, project_id, mr_iid, job_id, comment_id)
376
- comment = Comments.get_by_id(id_)
379
+ id_ = await Comments.create(forge, project_id, mr_iid, job_id, comment_id)
380
+ comment = await Comments.get_by_id(id_)
377
381
  return comment
378
382
 
379
383
  @classmethod
380
- def get_since(cls, time: datetime.datetime) -> List[Self]:
384
+ async def get_since(cls, time: datetime.datetime) -> List[Self]:
381
385
  """Get all the comments created after the given time."""
382
- with transaction(commit=False) as session:
383
- comments = (
384
- session.query(cls)
385
- .filter(
386
- Comments.created_at > time,
387
- )
388
- .all()
389
- )
386
+ query = select(cls).filter(Comments.created_at > time)
387
+ async with transaction(commit=False) as session:
388
+ query_result = await session.execute(query)
389
+ comments = query_result.scalars().all()
390
390
 
391
391
  return comments
392
392
 
393
393
  @classmethod
394
- def get_by_mr_job(
394
+ async def get_by_mr_job(
395
395
  cls, merge_request_job: GitlabMergeRequestJobs
396
396
  ) -> Optional["Comments"]:
397
397
  """Get the comment added for the specified merge request's job."""
398
- with transaction(commit=False) as session:
399
- comments = (
400
- session.query(cls)
401
- .filter(
402
- Comments.merge_request_job == merge_request_job,
403
- )
404
- .first() # just one
405
- )
406
-
398
+ query = select(cls).filter(Comments.merge_request_job == merge_request_job)
399
+ async with transaction(commit=False) as session:
400
+ query_result = await session.execute(query)
401
+ comments = query_result.scalars().first()
407
402
  return comments
408
403
 
409
404
 
@@ -440,7 +435,7 @@ class Reactions(Base):
440
435
 
441
436
  @classmethod
442
437
  @backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
443
- def create_or_update( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
438
+ async def create_or_update( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
444
439
  cls,
445
440
  forge: Forge,
446
441
  project_id: int,
@@ -462,11 +457,13 @@ class Reactions(Base):
462
457
  reaction_type: a str, ex. thumb_up
463
458
  count: number of reactions, of this type, given in the comment
464
459
  """
465
- comment = Comments.get_or_create(forge, project_id, mr_iid, job_id, comment_id)
466
- reaction = cls.get_reaction_by_type(
460
+ comment = await Comments.get_or_create(
461
+ forge, project_id, mr_iid, job_id, comment_id
462
+ )
463
+ reaction = await cls.get_reaction_by_type(
467
464
  forge, project_id, mr_iid, job_id, comment_id, reaction_type
468
465
  )
469
- with transaction(commit=True) as session:
466
+ async with transaction(commit=True) as session:
470
467
  if reaction:
471
468
  reaction.count = count # just update
472
469
  else:
@@ -475,11 +472,11 @@ class Reactions(Base):
475
472
  reaction.reaction_type = reaction_type
476
473
  reaction.count = count
477
474
  session.add(reaction)
478
- session.flush()
475
+ await session.flush()
479
476
  return reaction.id
480
477
 
481
478
  @classmethod
482
- def get_all_reactions( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
479
+ async def get_all_reactions( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
483
480
  cls,
484
481
  forge: Forge,
485
482
  project_id: int,
@@ -496,28 +493,28 @@ class Reactions(Base):
496
493
  job_id: forge job id
497
494
  comment_id: forge comment id
498
495
  """
499
- with transaction(commit=False) as session:
500
- reactions = (
501
- session.query(cls)
502
- .join(Comments, cls.comment_id == Comments.id)
503
- .join(
504
- GitlabMergeRequestJobs,
505
- Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
506
- )
507
- .filter(
508
- Comments.comment_id == comment_id,
509
- GitlabMergeRequestJobs.forge == forge,
510
- GitlabMergeRequestJobs.project_id == project_id,
511
- GitlabMergeRequestJobs.mr_iid == mr_iid,
512
- GitlabMergeRequestJobs.job_id == job_id,
513
- )
514
- .all()
496
+ query = (
497
+ select(cls)
498
+ .join(Comments, cls.comment_id == Comments.id)
499
+ .join(
500
+ GitlabMergeRequestJobs,
501
+ Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
515
502
  )
516
-
503
+ .filter(
504
+ Comments.comment_id == comment_id,
505
+ GitlabMergeRequestJobs.forge == forge,
506
+ GitlabMergeRequestJobs.project_id == project_id,
507
+ GitlabMergeRequestJobs.mr_iid == mr_iid,
508
+ GitlabMergeRequestJobs.job_id == job_id,
509
+ )
510
+ )
511
+ async with transaction(commit=False) as session:
512
+ query_result = await session.execute(query)
513
+ reactions = query_result.scalars().all()
517
514
  return reactions
518
515
 
519
516
  @classmethod
520
- def get_reaction_by_type( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
517
+ async def get_reaction_by_type( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
521
518
  cls,
522
519
  forge: Forge,
523
520
  project_id: int,
@@ -537,30 +534,30 @@ class Reactions(Base):
537
534
  comment_id: forge comment id
538
535
  reaction_type: str like "thumb-up"
539
536
  """
540
- with transaction(commit=False) as session:
541
- reaction = (
542
- session.query(cls)
543
- .join(Comments, cls.comment_id == Comments.id)
544
- .join(
545
- GitlabMergeRequestJobs,
546
- Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
547
- )
548
- .filter(
549
- Comments.comment_id == comment_id,
550
- GitlabMergeRequestJobs.forge == forge,
551
- GitlabMergeRequestJobs.project_id == project_id,
552
- GitlabMergeRequestJobs.mr_iid == mr_iid,
553
- GitlabMergeRequestJobs.job_id == job_id,
554
- Reactions.reaction_type == reaction_type,
555
- )
556
- .first()
537
+ query = (
538
+ select(cls)
539
+ .join(Comments, cls.comment_id == Comments.id)
540
+ .join(
541
+ GitlabMergeRequestJobs,
542
+ Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
557
543
  )
558
-
544
+ .filter(
545
+ Comments.comment_id == comment_id,
546
+ GitlabMergeRequestJobs.forge == forge,
547
+ GitlabMergeRequestJobs.project_id == project_id,
548
+ GitlabMergeRequestJobs.mr_iid == mr_iid,
549
+ GitlabMergeRequestJobs.job_id == job_id,
550
+ Reactions.reaction_type == reaction_type,
551
+ )
552
+ )
553
+ async with transaction(commit=False) as session:
554
+ query_result = await session.execute(query)
555
+ reaction = query_result.scalars().first()
559
556
  return reaction
560
557
 
561
558
  @classmethod
562
559
  @backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
563
- def delete( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
560
+ async def delete( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
564
561
  cls,
565
562
  forge: Forge,
566
563
  project_id: int,
@@ -580,25 +577,27 @@ class Reactions(Base):
580
577
  reaction_type: a str iterable, ex. ['thumbsup', 'thumbsdown']
581
578
  """
582
579
  for reaction_type in reaction_types:
583
- reaction = cls.get_reaction_by_type(
580
+ reaction = await cls.get_reaction_by_type(
584
581
  forge, project_id, mr_iid, job_id, comment_id, reaction_type
585
582
  )
586
- with transaction(commit=True) as session:
587
- session.delete(reaction)
588
- session.flush()
583
+ async with transaction(commit=True) as session:
584
+ await session.delete(reaction)
585
+ await session.flush()
589
586
 
590
587
  @classmethod
591
- def get_since(
588
+ async def get_since(
592
589
  cls, time: datetime.datetime
593
590
  ) -> List[Row[Tuple[datetime.datetime, Self]]]:
594
591
  """Get all the reactions on comments created after the given time
595
592
  and the comment creation time."""
596
- with transaction(commit=False) as session:
597
- reactions = (
598
- session.query(Comments.created_at, cls)
599
- .join(Comments, cls.comment_id == Comments.id)
600
- .filter(Comments.created_at > time)
601
- .all()
602
- )
593
+ query = (
594
+ select(Comments.created_at, cls)
595
+ .join(Comments, cls.comment_id == Comments.id)
596
+ .filter(Comments.created_at > time)
597
+ )
598
+
599
+ async with transaction(commit=False) as session:
600
+ query_results = await session.execute(query)
601
+ reactions = query_results.all()
603
602
 
604
603
  return reactions