
    %j                        d dl mZ d dlZd dlZd dlZd dlmZ  ee      j                         j                  Z
g dZg dZh dZh dZdd	hZh d
Zd Zd Zd Zd Zd Zd Zedk(  r e        yy)    )annotationsN)Path)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)row_idr   r   r   r   r	   r
   r   r   snippetverdictr   r   >   MWUSDmonthspercent>   
100% shareDigital Realty share!consolidated development projectsconsolidatedforecastactual>   $422,774 thousand$729,959 thousand$795,384 thousand$2,980,028 thousandc                    t        j                  ddt        |             j                  dd      j                  dd      j                  dd      j	                         S )Nz\s+ $ ,%)resubstrreplacestrip)ss    c/home/dev/research_loop/runs/auto-continue-20260607T140730Z-repair-loop04/artifacts/validate_dlr.pycompactr3      sJ    66&#s1v&..s26>>s2FNNsSUV\\^^    c                 Z    t        j                  t        dz  j                  d            S )Nzextracted_rows.jsonutf-8encoding)jsonloadsBASE	read_text r4   r2   	load_rowsr>      s%    ::t33>>>PQQr4   c                     t         dz  j                  dd      5 } t        t        j                  |             cd d d        S # 1 sw Y   y xY w)Nzverification_sample_checks.csvr)   r6   )newliner8   )r;   openlistcsv
DictReader)fs    r2   
load_vrowsrF      sD    
1
1	7	7W	7	U 'YZCNN1%&' ' 's   AAc                    t         dz  } | j                         sddgfS g }g }t        j                  | j	                  d            D ]r  }t         |d   z  }|j                         r|j                         j                  s|j                  d|d           Q|j                  |j	                  dd	             t d
j                  |      |fS )Nzsource_cache_manifest.jsonr)   z"source_cache_manifest.json missingr6   r7   text_cache_pathzcached source text missing: ignore)r8   errors
)	r;   existsr9   r:   r<   statst_sizeappendjoin)manifest_pathrJ   partssrcps        r2   load_cached_textrU      s    77M!8999FEzz-1171CD I3())xxz!1!1MM8=N9O8PQRLLghGHI 99UV##r4   c                8   g g }}t               \  }}|j                  |       t        |      }t        |       dk  r|j	                  dt        |               t        | d      D ]  \  }}t        D cg c]  }||vs||   dv s| }	}|	r|j	                  d| d|	        |j                  d      dk7  r|j	                  d| d	       |j                  d
      t        vr&|j	                  d| d|j                  d
              |j                  d      t        vr&|j	                  d| d|j                  d              |j                  d      t        vr&|j	                  d| d|j                  d              t        |j                  d      t              s&|j	                  d| d|j                  d              t        |j                  dd            j                  d      s|j	                  d| d       |j                  d      dk7  r|j	                  d| d       t        |j                  dd            }
t        |
      |vr&|j	                  d| d|j                  d              t        |j                  dd            }|j                  d      dvsJt        |      t        |
      vsb|t        v r(|j	                  d| d|j                  d              |j	                  d| d |j                  d               t!        d! | D              d"k  r|j	                  d#       t#               }t        |      d$k  r|j	                  d%t        |              t        |d      D ]  \  }}t$        D cg c]  }||vs||   dv s| }	}|	r|j	                  d&| d|	        t        |j                  dd            j                  d      s|j	                  d&| d       |j                  d'      d(k7  r|j	                  d&| d)       t        |j                  d*d            |vs|j	                  d&| d+        i }| D ]   }|j                  |d   d,      dz   ||d   <   " |sd-nd.t        |       ||t'        d/ |D              sd-nd.t        |       dk\  rd-nd.|sd-nd.t'        d0 |D              sd-nd.t'        d1 |D              sd-nd.t'        d2 |D              sd-nd.t'        d3 |D              sd-nd.t'        d4 |D              sd-nd.t'        d5 |D              sd-nd.t        |      d$k\  rd-nd.|rt'        d6 |D              sd-nd.|rt'        d7 |D              sd-nd.d8|t        |      d9S c c}w c c}w ):N   z.minimum row count failed: expected >= 15, got    )r)   Nzrow z missing required fields: r   DLRz company is not DLRr
   z unit not normalized: r   z unsupported ownership_basis: r   z invalid forecast_or_actual: r   z invalid is_derived flag: r   r)   zhttps://z  source_url missing or not httpsr   	supportedz( snippet_support_status is not supportedr   z1 source_snippet not found in cached source text: r   r   r   >   rangederived_qoqderived_sumweighted_average_lagz. raw value visible before unit normalization: z7 raw value not visible in cited cached-source snippet: c              3  H   K   | ]  }|j                  d       du sd  yw)r   TrX   N)get).0rs     r2   	<genexpr>zvalidate.<locals>.<genexpr>P   s      
:aeeL1T91
:s   ""   z;expected at least two derived rows for qoq and sum handling   z7verification CSV needs at least 12 sampled rows, found zverification row r   PASSz verdict is not PASSr   z( snippet not found in cached source textr   passfailc              3  $   K   | ]  }d |v  
 yw)missing requiredNr=   ra   es     r2   rc   zvalidate.<locals>.<genexpr>k   s     0YQ1Cq1H0Y   c              3  0   K   | ]  }d |v xr d|v  yw)r   verificationNr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>n   s$     4sgh\Q5F5b>abKb5b4s   c              3  $   K   | ]  }d |v  
 yw)zunit not normalizedNr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>o   s     3_ST4IQ4N3_rm   c              3  $   K   | ]  }d |v  
 yw)r   Nr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>p   s     0XA1Ba1G0Xrm   c              3  $   K   | ]  }d |v  
 yw)r   Nr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>q   s     3^RS4HA4M3^rm   c              3  $   K   | ]  }d |v  
 yw)derivedNr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>r   s     6V!yA~6Vrm   c              3  0   K   | ]  }d |v xs d|v   yw)zcached source textzcached-sourceNr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>s   s/       @Cvw@TXY@Y@q]lpq]q@q  @Crp   c              3  0   K   | ]  }d |v xr d|v   yw)verification rowr   Nr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>u   s3       NM  ABN`deNeN{jvz{j{N{  NMrp   c              3  0   K   | ]  }d |v xr d|v   yw)rx   rj   Nr=   rk   s     r2   rc   zvalidate.<locals>.<genexpr>v   s3       LQ  EFL^bcLcLhz~hL  LQrp   )required_fieldsminimum_row_countsource_cache_presentsource_url_presenceunit_normalizationr   r   derived_flag_handlingsnippet_provenance_cached_textverification_csv_minimum_rows"verification_csv_https_source_urls verification_csv_required_fields)status	row_countrJ   warningschecksownership_basis_countsverification_sampled_row_count)rU   extendr3   lenrO   	enumerateREQr`   UNITSOWNCLASS
isinstanceboolr.   
startswithNORMALIZED_ONLYsumrF   VREQany)rowsrJ   r   cached_textcache_errorscached_compactirowrE   missr   rawvrowsbasiss                 r2   validater   )   s   2HF 0 2K
MM,[)N
4y2~Fs4ykRSD!$ y3Ga!3,#a&J2FGGMMD#=dVDE779&MMD#678776?%'MMD#9#''&/9JKL77$%S0MMD#A#''J[B\A]^_77'(5MMD#@I]A^@_`a#'',/6MMD#=cggl>S=TUV377<,-88DMMD#CDE77+,;MMD#KLMcgg.347>1MMD#TUXU\U\]jUkTlmn#''+r*+77$%-iinuvynz  CJ  KR  CS  oSo%$qc)WX[X_X_`mXnWo pqQC'^_b_f_fgt_u^vwx9y< 
:d
::Q>STLE
5zBOPSTYPZ|\]E1% 	[3Ha1C<3q6Z3GHHMM-aS0J4&QR377<,-88DMM-aS0PQR779'MM-aS0DEF3779b)*.@MM-aS0XYZ	[ E Q(-		#6G2H!(Lq(Pc#$%Q !'&FY-00YRX0Y-Yv_e+.t9?2>FF144slr4s1s6y033_X^3_0_&ek-00XQW0X-Xv^d033^W]3^0^&dj366Vv6V3VV\b<?  @C  |B  @C  =Cf  IO7:5zR7GVV<A#  NM  FL  NM  KM&  SY:?  LQ  JP  LQ  IQ  W]
 #(*-e*) e HH Is   4VVV&Vc                     t        t                     } t        dz  j                  t	        j
                  | dd      dz   d       | d   d	k7  rt        d
      y )Nzvalidation_report.jsonrd   F)indentensure_asciirK   r6   r7   r   rg   rX   )r   r>   r;   
write_textr9   dumps
SystemExit)reports    r2   mainr   |   sX    ik"F	$$00F1[`1adh1hsz0{h6!m "r4   __main__)
__future__r   rC   r9   r,   pathlibr   __file__resolveparentr;   r   r   r   r   r   r   r3   r>   rF   rU   r   r   __name__r=   r4   r2   <module>r      s    " 
  	 H~&& t b'^	He_R'$Qf zF r4   