
    
Jj]                       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                  d   Zedz  ZdZd	Zd
ZddZddZddZddZefddZddZedfddZddZedk(  r e        yy)z>Build a compact mobile/browser runtime-controls smoke summary.    )annotationsN)Path)Any   outz"mobile_browser_controls_smoke.jsonz$mobile_browser_controls_summary.jsonz$mobile_browser_controls_summary.htmlc                p    | j                         r%t        j                  | j                  d            S i S )Nutf-8encoding)existsjsonloads	read_text)paths    >/home/exedev/hwanse/tools/summarize_mobile_browser_controls.py	load_jsonr      s)    ;?;;=4::dnngn67PbP    c                b    t        t        j                  | dd      j                  d            S )NF,:ensure_ascii
separatorsr	   )lenr   dumpsencode)payloads    r   compact_json_sizer      s&    tzz'*MTTU\]^^r   c           
        | j                         s|j                         sy t        |      }|sy t        |j                  d      xs( |j                  d      xs |j                  d      xs d      }|j	                  dd||dddd	       |S )
NlastRecordedSourceSizeBytesremovedRawSizeBytessourceSizeBytesr   zraw-removed-summary-retainedFz{Run tools/verify_mobile_browser_controls.py locally to regenerate the ignored raw smoke when debugging browser regressions.a	  Compact browser runtime-controls smoke contract. It keeps the top-level status/search fields and checks used by movement, completion, and event/battle audit surfaces. The checked-in raw smoke was removed; the verifier can regenerate it locally as an ignored output.)statusr#   r!   r"   rawFilePresentrawRegenerationboundary)r   r   intgetupdate)r   summary_pathsummaryrecorded_sizes       r   fallback_removed_summaryr.      s    {{}L//1%G12 	;;,-	;;()	 	M NN4 +8#0#  ]O	
  Nr   c                6   g }t        | j                               D ]6  \  }}|j                  |t        |      j                  t        |      d       8 t        |      t        d |D              t        |d d      d d |D cg c]  }|d   	 c}dS c c}w )	N)keytype	sizeBytesc              3  8   K   | ]  }t        |d            yw)r2   Nr(   .0rows     r   	<genexpr>z)build_snapshot_summary.<locals>.<genexpr>F   s     Dc#k"23Ds   c                    t        | d         S )Nr2   r4   )r7   s    r   <lambda>z(build_snapshot_summary.<locals>.<lambda>G   s    C4D0E r   T)r0   reverse   r0   )counttotalSizeByteslargestkeys)sorteditemsappendr1   __name__r   r   sum)	snapshotsrowsr0   valuer7   s        r   build_snapshot_summaryrI   :   s    DY__./ 

UU,,.u5	

 TDtDD$$EtTUXVXY'+,U,	  -s   B
c           	        | dz  }|t         z  }t        ||t        z        }||S t        |      }|j	                         D ci c]  \  }}|dk7  s|| }}}t        |j                  d      t              r|j                  d      ni }dt          |d<   t        |      |d<   t        |      }	ddddt          d|j                         r|j                         j                  nd	|	|d
S c c}}w )Nr   rF   zout/
sourceFilez&hwanse-mobile-browser-controls-summaryz*tools/summarize_mobile_browser_controls.pyreadya6  Compact browser runtime-controls smoke contract. It keeps the top-level status/search fields and checks used by movement, completion, and event/battle audit surfaces, while replacing raw browser snapshots with a key/size summary. The raw smoke is verifier output and should not be committed after regeneration.r   )kindsourcer$   rK   r'   r#   compactSizeBytescontrols)SOURCE_FILEr.   SUMMARY_FILEr   rB   
isinstancer)   dictrI   r   r   statst_size)
rootout_dirr   fallbackr   r0   rH   rP   rF   compact_sizes
             r   build_summaryr[   L   s    UlG[ D'g.DEHoG-4]]_SzsE{@RU
SHS,6w{{;7OQU,VK(\^I#K=1H\29=H[$X.L8>[M*, 37++-499;..Q(  Ts   C-C-c                   | d   }t        | d         dd}| j                  d      r|dt        | d         ddz  }g }|j                         D ]T  \  }}|dv r|j                  d	t	        j
                  |       d
t	        j
                  t        |            d d  d       V dj                  d |j                  d      xs i j                         D              }dj                  d |j                  d      xs i j                  dg       D              }dt	        j
                  | d          dt	        j
                  | d          dt	        j
                  |       dt        | d         dddj                  |       d| d| dS )NrP   r#   r   z
 bytes rawr!   z (removed; last recorded z bytes)>   checksrF   <tr><td><code></code></td><td>i  
</td></tr>
c           	   3     K   | ]B  \  }}d t        j                  |       dt        j                  t        |            dd  d D yw)r^   r_   Ni@  r`   )htmlescapestr)r6   r0   rH   s      r   r8   zhtml_page.<locals>.<genexpr>y   sV      
 C		[[%& '{{3u:&u-. /	s   AA
r]   c           
   3     K   | ]I  }d t        j                  |d          dt        |d         ddt        j                  |d          d K yw)	r^   r0   r_   r2   r   z	</td><td>r1   r`   N)rc   rd   r(   r5   s     r   r8   zhtml_page.<locals>.<genexpr>   sf       	[[U,- .3{#$Q' ({{3v;'( )	s   AArF   r?   a)  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Mobile Browser Controls Summary</title>
  <style>
    body { margin: 24px; color: #202124; font-family: system-ui, sans-serif; line-height: 1.5; }
    table { width: 100%; border-collapse: collapse; margin: 14px 0 28px; }
    th, td { border: 1px solid #d7dce2; padding: 6px 8px; text-align: left; vertical-align: top; }
    th { background: #f4f6f8; }
    code { background: #f4f6f8; padding: 1px 4px; }
  </style>
</head>
<body>
  <h1>Mobile Browser Controls Summary</h1>
  <p>r'   z</p>
  <p><code>rK   z	</code>: z, rO   z~ bytes compact.</p>
  <h2>Top-Level Fields</h2>
  <table>
    <thead><tr><th>field</th><th>value</th></tr></thead>
    <tbody> zt</tbody>
  </table>
  <h2>Checks</h2>
  <table>
    <thead><tr><th>check</th><th>value</th></tr></thead>
    <tbody>z</tbody>
  </table>
  <h2>Largest Raw Snapshots</h2>
  <table>
    <thead><tr><th>snapshot</th><th>raw bytes</th><th>type</th></tr></thead>
    <tbody>z$</tbody>
  </table>
</body>
</html>
)r(   r)   rB   rC   rc   rd   re   join)r,   rP   raw_linescalar_rowsr0   rH   
check_rowssnapshot_rowss           r   	html_pagerm   j   s   z"Hg/01!4J?H{{01/G<Y4Z0[\]/^^effKnn& 

U))S)* +;;s5z*5D12 3	

  
 $<<17R>>@ J II  LL-388BG M kk'*%&' (KK-./yX9N8OrRUV]^pVqRrstQu v GGK ! "
 < 
 ? =" "r   c                   |j                  dd       |t        z  j                  t        j                  | dd      d       |:|j
                  j                  dd       |j                  t        |       d       y y )NT)parentsexist_okFr   r   r	   r
   )mkdirrR   
write_textr   r   parentrm   )r,   rX   html_outs      r   write_outputsru      sy    MM$M.|''

7:F (  dT:Ig.A r   c                 l   t        j                         } | j                  dt        t               | j                  dt        d       | j                         }|j                  j                         }|j                  r|j                  j                         nd }t        t        |      |dz  |       y )Nz--root)r1   defaultz
--html-outzGOptional local HTML review output. The committed contract is JSON-only.)r1   helpr   )rt   )argparseArgumentParseradd_argumentr   ROOT
parse_argsrW   resolvert   ru   r[   )parserargsrW   rt   s       r   mainr      s    $$&F
tT:
V  
 D99D*.--t}}$$&TH-%te|hGr   __main__)r   r   returndict[str, Any])r   r   r   r(   )r   r   r+   r   r   zdict[str, Any] | None)rF   r   r   r   )rW   r   r   r   )r,   r   r   re   )r,   r   rX   r   rt   zPath | Noner   None)r   r   )__doc__
__future__r   ry   rc   r   pathlibr   typingr   __file__r~   ro   r|   OUTrQ   rR   SUMMARY_HTMLr   r   r.   rI   r[   rm   ru   r   rD    r   r   <module>r      s    D "      H~''*
Ul255Q_>$  $ <@F <?X\ BH zF r   