
    E%j                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  e	e
      j                         j                  Zedz  Zedz  Zedz  Zed	z  Zg d
Zg dZg dZddZddZddZddZddZedk(  r e        yy)zDValidate the offline DLR Development Lifecycle extraction artifacts.    )annotationsN)Decimal)Pathz$extract_dlr_development_lifecycle.pyz&dlr_development_lifecycle_manifest.csvz"dlr_development_lifecycle_rows.csvz.dlr_development_lifecycle_validation_report.md)companyperiodmetric_name	raw_valuenormalized_valueunitvalue_qualifierownership_basisforecast_or_actual
is_derived
source_urlsource_locationsource_snippetsnippet_support_status
confidencecaveat)2Q243Q244Q241Q252Q253Q254Q251Q26)future_land_mwfuture_shell_mwconstruction_underway_mwpreleased_percentage0development_lifecycle_total_investment_100_usd_mc                    t        |       )N)AssertionError)messages    f/home/dev/research_loop/runs/next3-task1-dlr-extractor/artifacts/validate_dlr_development_lifecycle.pyfailr'   0   s    

!!    c                    | j                  dd      5 }t        t        j                  |            cd d d        S # 1 sw Y   y xY w)N utf-8)newlineencoding)openlistcsv
DictReader)pathhandles     r&   read_csvr4   4   s:    	2	0 ,FCNN6*+, , ,s	   <Ac                x    t        | j                  dd      j                  dd      j                  dd            S )N,r*   $%)r   replace)values    r&   
as_decimalr;   9   s2    5==b)11#r:BB3KLLr(   c                    t        j                  t        j                  t	        t
              gt        d       t        t              } t        t              }g }t        |       dk7  rt        dt        |               |j                  d       t        |      dk7  rt        dt        |              |j                  d       |r.t        |d	   j                               t        k7  rt        d
       |j                  d       t!        |D ch c]  }|d   	 c}t"        j$                        }|t"        k7  rt        d|        |j                  d       t"        D ]7  }|D cg c]  }|d   |k(  s|d    }}|t&        k7  s(t        | d|        9 |j                  d       |D ]  }t        D ]%  }||   dk(  st        d| d|d    d|d           ' |d   j)                  d      st        d|d           |d   dvrt        d|d           |d   dk7  swt        d|         |j                  d        |j                  d!       |D ]o  }|d   d"k(  s|d#   j+                  d$      st        d%|        t-        |d#         t-        |d&         k7  rt        d'|        |d(   d)k7  sbt        d*|        q |j                  d+       |D ]s  }|d   d,k(  st-        |d#         t/        d-      z  }t-        |d&         }	||	k7  rt        d.|        |d(   d/k7  rt        d0|        |d1   d2k7  sft        d3|        u |j                  d4       |D ]7  }|d   d,k7  st-        |d#         t-        |d&         k7  s*t        d5|        9 |j                  d6       t0        j3                  d7d8j5                  d9 |D              z   d8z   d:;       |S c c}w c c}w )<NT)cwdcheck   z#manifest row count expected 8, got z/manifest has one compact source row per quarter(   z%canonical row count expected 40, got z$canonical output has exactly 40 rowsr   z4canonical schema does not match required field orderz:canonical schema and field order match required DLR schemar   )keyzperiod coverage mismatch: z5all eight quarters from 2Q24 through 1Q26 are presentr   z metric set/order mismatch: z?each quarter has exactly the five Development Lifecycle metricsr*   zmissing z in  r   )z#https://investor.digitalrealty.com/zhttps://www.sec.gov/zunexpected source URL: r   >   exactpartialzunsupported snippet status: r   highzexpected high confidence: zJsource URL, source location, snippet, confidence, and caveat are populatedz3snippet support statuses are explicit and supportedr!   r	   r8   z*preleased raw value missing percent sign: r
   z%preleased normalized value mismatch: r   percentzpreleased unit mismatch: z6percent parsing strips '%' and preserves percent unitsr"   1000z3USD thousands to USD millions conversion mismatch: USD_millionszinvestment unit mismatch: r   total_100_sharez%investment ownership basis mismatch: zDdevelopment investment converts source USD thousands to USD millionsz&MW/percent normalized value mismatch: z@MW metrics preserve source values apart from comma normalizationz# DLR Development Lifecycle Validation Report

This validator executes the offline extractor against a verified manifest; it does not fetch or parse live PDFs.

## Result

PASS

## Checks


c              3  (   K   | ]
  }d | d  yw)z- .N ).0r>   s     r&   	<genexpr>zvalidate.<locals>.<genexpr>   s     6ebqM6s   r+   )r-   )
subprocessrunsys
executablestr	EXTRACTORBASE_DIRr4   MANIFESTOUTPUTlenr'   appendr/   keysREQUIRED_FIELDSsortedEXPECTED_PERIODSindexEXPECTED_METRICS
startswithendswithr;   r   REPORT
write_textjoin)
manifest_rowsrowschecksrowperiodsr   metricsfieldexpectedactuals
             r&   validatero   =   s6   NNCNNC	N3NX&MFDF
=Q23}3E2FGH
MMCD
4yB4SYK@A
MM89T!W\\^$7CD
MMNOt4c(m4:J:P:PQG"")'34
MMIJ" C15Q#X&9P3}%QQ&&F87yABC MMST 	5$ 	QE5zRxwd3x=/3};M:NOP	Q < ++,kl*3|+<*=>?'(0DD/4L0M/NOP|&-cU34	5 MM^_
MMGH 8}!77{#,,S1A#GH#k*+z#>P:Q/RR<SEBC6{i'0678 MMJK 	D}!SS!#k"23gfoEH$6 78F6!J3%PQ6{n,1#78$%)::<SEBC	D MMXY E}!SS#k*+z#>P:Q/RR=cUCDE MMTU
	
 ))6v6
6	7 	   	 M} 5 Rs   O'(O,6O,c                 .    t                t        d       y )NzEPASS: DLR Development Lifecycle extractor produced 40 validated rows.)ro   printrM   r(   r&   mainrr      s    J	
QRr(   __main__)r%   rT   returnNone)r2   r   rt   zlist[dict[str, str]])r:   rT   rt   r   )rt   z	list[str])rt   ru   )__doc__
__future__r   r0   rP   rR   decimalr   pathlibr   __file__resolveparentrV   rU   rW   rX   rc   r\   r^   r`   r'   r4   r;   ro   rr   __name__rM   r(   r&   <module>r~      s    J " 
  
   >!!#**==	>>	8	8	D	D& T  ",
MQhS
 zF r(   