Coverage for polar/meter/tasks.py: 57%
26 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-12-05 15:52 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-12-05 15:52 +0000
1import uuid 1a
3from apscheduler.triggers.cron import CronTrigger 1a
4from sqlalchemy.orm import joinedload 1a
6from polar.exceptions import PolarTaskError 1a
7from polar.meter.repository import MeterRepository 1a
8from polar.meter.service import meter as meter_service 1a
9from polar.models import Meter 1a
10from polar.worker import AsyncSessionMaker, TaskPriority, actor 1a
13class MeterTaskError(PolarTaskError): ... 1a
16class MeterDoesNotExist(MeterTaskError): 1a
17 def __init__(self, meter_id: uuid.UUID) -> None: 1a
18 self.meter_id = meter_id
19 message = f"The meter with id {meter_id} does not exist."
20 super().__init__(message)
23@actor( 1a
24 actor_name="meter.enqueue_billing",
25 cron_trigger=CronTrigger.from_crontab("*/5 * * * *"),
26 priority=TaskPriority.LOW,
27)
28async def meter_enqueue_billing() -> None: 1a
29 async with AsyncSessionMaker() as session:
30 await meter_service.enqueue_billing(session)
33@actor(actor_name="meter.billing_entries", priority=TaskPriority.LOW) 1a
34async def meter_billing_entries(meter_id: uuid.UUID) -> None: 1a
35 async with AsyncSessionMaker() as session:
36 repository = MeterRepository.from_session(session)
37 meter = await repository.get_by_id(
38 meter_id, options=(joinedload(Meter.last_billed_event),)
39 )
40 if meter is None:
41 raise MeterDoesNotExist(meter_id)
43 await meter_service.create_billing_entries(session, meter)