Coverage for polar/meter/tasks.py: 57%

26 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 17:15 +0000

1import uuid 1a

2 

3from apscheduler.triggers.cron import CronTrigger 1a

4from sqlalchemy.orm import joinedload 1a

5 

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

11 

12 

13class MeterTaskError(PolarTaskError): ... 1a

14 

15 

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) 

21 

22 

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) 

31 

32 

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) 

42 

43 await meter_service.create_billing_entries(session, meter)