
    gj                    ~    d dl mZ d dlmZmZmZmZ d dlmZ ed         Z ed          Z	ddZ
de	dddZddZdS )    )annotations)UTCdatedatetime	timedelta)Literal)freshstalepartialunavailableunknown   )daysvalue
str | Nonereturndatetime | Nonec                   | sdS |                                  }	 t          |          dk    rJt          j        t	          j        |          t          j                                        t                    S t          j        |	                    dd                    }n# t          $ r Y dS w xY w|j        |	                    t                    n|                    t                    S )zDParse a source date/time as UTC without substituting a receive time.N
   tzinfoZz+00:00)striplenr   combiner   fromisoformatmintimer   replace
ValueErrorr   
astimezone)r   rawparseds      ~/home/agent/.hermes/worktrees/FinanceManager-sprint14-twr-xirr-performance-attribution/src/jarvis_finance/quality/freshness.pyparse_source_timer%      s     t
++--Cs88r>>#D$6s$;$;X\=N=N=P=PY\]]]]'C(B(BCC   tt)/)>6>>>%%%FDUDUVYDZDZZs   AB  7(B   
B.-B.N)nowmax_age	availableboolas_ofr&   r'   r   FreshnessStatusc                    | sdS t          |          }|dS |pt          j        t                    }|j        |                    t                    n|                    t                    }||z
  |k    rdndS )Nr   r   r   r
   r	   )r%   r   r&   r   r   r   r!   )r(   r*   r&   r'   source_time	references         r$   freshness_statusr/      s      }#E**Ky(x|C((I1:1A1I	!!!---yOcOcdgOhOhI+-7777WD    statuseslist[FreshnessStatus]c                    d | D             }|sdS t          |          t          |           k    sd|v rdS d|v rdS d|v rdS dS )zICollapse read-model sources without claiming availability that is absent.c                    g | ]
}|d k    |S )r    ).0statuss     r$   
<listcomp>z&combined_freshness.<locals>.<listcomp>.   s"    HHH&-0G0Gv0G0G0Gr0   r   r   r
   r   r	   )r   )r1   presents     r$   combined_freshnessr:   ,   sm    HHHHHHG }
7||s8}}$$	W(<(<y'wGy7r0   )r   r   r   r   )
r(   r)   r*   r   r&   r   r'   r   r   r+   )r1   r2   r   r+   )
__future__r   r   r   r   r   typingr   r+   DEFAULT_FRESHNESS_MAX_AGEr%   r/   r:   r5   r0   r$   <module>r>      s    " " " " " " 3 3 3 3 3 3 3 3 3 3 3 3      OP &I1--- [ [ [ [$  2E E E E E E"     r0   