Ë
    �o¨j°   ã                  ó  — d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ  ee«      j                  «       j                   j                   Zej                   Zedz  dz  Z eej(                  j+                  dedz  «      «      Z eej(                  j+                  d	ed
z  dz  dz  dz  «      «      Zedz  dz  dz  dz  ZdZdd„Zdd„Zdd„Zd d„Zd!d"d„Zd#d„Zd#d„Z d#d„Z!d#d„Z"d#d„Z#d#d„Z$e%dk(  r e$«        yy)$uÕ  è¾žæ›¸æ”¹å–„ã�®è©¦è¡Œè¨˜éŒ² (probe èªžå�¥ / A/B è¡Œ) ã‚’é‡�è¤‡ã�ªã�—ã�§ç´¯ç©�ã�™ã‚‹ã€‚

- probe: èªžå�¥ãƒªã‚¹ãƒˆã‚’ furigana lookup --batch ã�§èª­ã�¿ã€� èªžå�¥ã‚’ ledger ã�«ç™»éŒ²ã�—ã�¦çµ�æžœã‚’å‡ºã�™
- ab:    dict-diff ã‚’å®Ÿè¡Œã�—ã€� å…¥åŠ›è¡Œã‚’ ledger ã�«ç™»éŒ²ã�—ã�¦ diff ã‚’å‡ºã�™
- round: 1 ãƒ©ã‚¦ãƒ³ãƒ‰ã�®æˆ�æžœ (ä¿®æ­£æ•° / å›žå¸°è¿½åŠ æ•° / commit) ã‚’è¨˜éŒ²
- import: å®Ÿè¡Œæ¸ˆã�¿ã�®èªžå�¥ / è¡Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’èª­ã�¿ç›´ã�•ã�šã�«ç™»éŒ² (é�ŽåŽ»åˆ†ã�®å�–ã‚Šè¾¼ã�¿)
- stats: ç´¯è¨ˆ (é‡�è¤‡é™¤åŽ»å¾Œã�®èªžå�¥æ•° / è¡Œæ•°) ã�¨ãƒ©ã‚¦ãƒ³ãƒ‰ä¸€è¦§

é‡�è¤‡åˆ¤å®šã�¯ NFKC + å‰�å¾Œç©ºç™½é™¤åŽ»ã�—ã�Ÿæ–‡å­—åˆ—ã�® sha1ã€‚ ä¿�å­˜ã�™ã‚‹ã�®ã�¯ hash ã� ã�‘ã�§ã€�
èªžå�¥ãƒ»ã‚³ãƒ¡ãƒ³ãƒˆæœ¬æ–‡ã��ã�®ã‚‚ã�®ã�¯ ledger ã�«æ®‹ã�•ã�ªã�„ã€‚
é    )ÚannotationsN)ÚPathÚdatazprobe_ledger.sqliteÚFURIGANA_DICT_ROOTzfurigana-dictÚFURIGANA_BINÚfuriganaÚtargetÚreleasezfurigana.exez
rust-toolszdict-diff.exe)ÚjukugoÚunihanÚkanjiÚ	loanwordsÚworksc                 óœ   — t         j                  j                  dd¬«       t        j                  t         «      } | j                  d«       | S )NT)ÚparentsÚexist_okaà  
        create table if not exists terms (h blob primary key, first_date text, first_round text);
        create table if not exists lines (h blob primary key, first_date text, first_round text);
        create table if not exists rounds (
            id integer primary key, date text, round text,
            terms_in integer, terms_new integer, lines_in integer, lines_new integer,
            ab_changed integer, fixed integer, cases_added integer, commit_sha text);
        )ÚDBÚparentÚmkdirÚsqlite3ÚconnectÚexecutescript)Úcons    õR   /var/www/html/é…�ä¿¡ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–/videos/stream-comments/scripts/probe_ledger.pyr   r   !   s>   € Ü‡I�I‡O�O˜D¨4€OÔ0Ü
�/‰/œ"Ó
€CØ×Ñð	ô	ð €Jó    c                óª   — t        j                  t        j                  d| «      j	                  «       j                  d«      «      j                  «       S )NÚNFKCúutf-8)ÚhashlibÚsha1ÚunicodedataÚ	normalizeÚstripÚencodeÚdigest)Úss    r   Úkeyr'   1   s;   € Ü�<‰<œ×-Ñ-¨f°aÓ8×>Ñ>Ó@×GÑGÈÓPÓQ×XÑXÓZÐZr   c                ó®  ‡‡— t         j                  j                  «       j                  «       Š|D �ch c]  }|j	                  «       sŒt        |«      ’Œ  }}| j                  d|› �«      j                  «       d   }| j                  d|› d�ˆˆfd„|D «       «       | j                  d|› �«      j                  «       d   }t        |«      ||z
  fS c c}w )Nzselect count(*) from r   zinsert or ignore into z values (?, ?, ?)c              3  ó(   •K  — | ]	  }|‰‰f–— Œ y ­w)N© )Ú.0ÚhÚ
round_nameÚtodays     €€r   ú	<genexpr>zregister.<locals>.<genexpr>:   s   øè ø€ Ò;_ÐWX¸QÀÀzÔ<RÑ;_ùs   ƒ)
ÚdtÚdater.   Ú	isoformatr#   r'   ÚexecuteÚfetchoneÚexecutemanyÚlen)	r   ÚtableÚitemsr-   ÚxÚhsÚbeforeÚafterr.   s	      `    @r   Úregisterr=   5   s¾   ù€ Ü�G‰G�M‰M‹O×%Ñ%Ó'€EØÖ	-�Q 1§7¡7¥9Œ#ˆa�&Ð	-€BÐ	-Ø�[‰[Ð0°°Ð8Ó9×BÑBÓDÀQÑG€FØ‡O�OØ
   Ð'8Ð9Ô;_Ð\^Ô;_ôð �K‰KÐ/°¨wÐ7Ó8×AÑAÓCÀAÑF€EÜˆr‹7�E˜F‘NÐ"Ð"ùò 
.s   ³CÁ	Cc                ó¼  — t         j                  j                  «       j                  «       }| j	                  d||f«      j                  «       }|€6| j	                  d||f«       | j	                  d||f«      j                  «       }|j                  «       D ]C  \  }}|dv r| j	                  d|› d�||d   f«       Œ&| j	                  d|› d|› d�||d   f«       ŒE y )	Nz.select id from rounds where date=? and round=?z�insert into rounds (date, round, terms_in, terms_new, lines_in, lines_new, ab_changed, fixed, cases_added) values (?, ?, 0, 0, 0, 0, 0, 0, 0)©Ú
commit_shazupdate rounds set z=? where id=?r   z
=coalesce(z,0)+? where id=?)r0   r1   r.   r2   r3   r4   r8   )r   r-   Úcolsr.   ÚrowÚcÚvs          r   Úupsert_roundrE   @   sñ   € Ü�G‰G�M‰M‹O×%Ñ%Ó'€EØ
�+‰+Ø8¸5À*Ð:Móç�hƒjð ð €{Ø�‰ðRà�JÐô	
ð
 �k‰kØ<¸uÀjÐ>Qó
ç
‰(‹*ð 	ð —
‘
“ò \‰ˆˆ1Ø�ÑØ�K‰KÐ,¨Q¨C¨}Ð=ÀÀ3ÀqÁ6¸{ÕKà�K‰KÐ,¨Q¨C¨z¸!¸Ð<LÐMÐPQÐSVÐWXÑSYÈ{Õ[ñ	\r   c                ót   — d|› �t        | dz  «      g}t        D ]  }|d|› �t        | dz  |z  «      gz  }Œ |S )Nz--rules-dirÚrulesz--core-dict-dirÚcore)ÚstrÚSUBS)ÚrootÚsuffixÚar&   s       r   Ú	dict_argsrN   U   sV   € Ø�v�hÐ	¤ T¨G¡^Ó!4Ð5€AÜò BˆØ	� ˜xÐ(¬#¨d°V©m¸aÑ.?Ó*@ÐAÑA‰ðBà€Hr   c                ó   — t        | j                  d¬«      D �cg c]$  }|j                  «       sŒ|j                  d«      ‘Œ& }}t	        j
                  t        t        «      dd| j                  gt        t        «      ¢d‘dj                  |«      dz   dddd¬«      j                  j                  «       }t        ||«      D ]  \  }}t        |› d	|› �«       Œ t!        «       }t#        |d
|| j$                  «      \  }}t'        || j$                  ||¬«       |j)                  «        t        d|› d|› d�t*        j,                  ¬«       y c c}w )Nr   ©Úencodingú
Úlookupú--modez--batchT)ÚinputÚcapture_outputÚtextrQ   Úcheckú	Úterms©Úterms_inÚ	terms_newz[ledger] probe u    èªžå�¥ (æ–°è¦� ú)©Úfile)Úopenr`   r#   ÚrstripÚ
subprocessÚrunrI   ÚBINÚmoderN   ÚDICTÚjoinÚstdoutÚ
splitlinesÚzipÚprintr   r=   ÚroundrE   ÚcommitÚsysÚstderr)	ÚnsÚlr8   ÚoutÚiÚor   Ún_inÚn_news	            r   Ú	cmd_proberx   \   s  € Ü%)¨"¯'©'¸GÔ%DÖR ÈÏÉÍ	ˆQ�X‰X�d�^ÐR€EÐRÜ
�.‰.Ü	ŒS‹�8˜X r§w¡wÐL´¼4³ÐLÀ)ÐLØ�i‰i˜Ó Ñ%°dÀÐPWÐ_cô÷ �f�Z‰Z‹\ð ô �E˜3“ò ‰ˆˆ1Ü���2�a�SˆkÕðä
‹)€CÜ˜3 ¨°·±Ó9�K€Dˆ%Ü��b—h‘h¨¸Õ?Ø‡J�J„LÜ	ˆO˜D˜6Ð!1°%°¸Ð
:ÄÇÁÖLùò Ss
   šE°Ec                óâ  — t        | j                  «      }t        j                  t	        t
        «      gt        |d«      ¢t        t        d«      ¢d‘| j                  ‘| j                  ¢dddd¬«      }t        j                  j                  |j                  «       d}|j                  j                  «       D ]0  }|j                  d«      sŒt        |j!                  «       d	   «      }Œ2 g }| j                  D ]8  }t#        |d¬
«      D ]&  }|j%                  |j!                  dd	«      d   «       Œ( Œ: t'        «       }t)        |d|| j*                  «      \  }}	t-        || j*                  |	¬«       |j/                  d||t0        j2                  j5                  «       j7                  «       | j*                  f«       |j9                  «        t;        d|› d|	› d|› �t        j<                  ¬«       y )Nz-az-brT   Tr   )rV   rW   rQ   rX   r   zChanged:é   rP   rY   éÿÿÿÿÚlines)Ú	lines_newzCupdate rounds set lines_in=?, ab_changed=? where date=? and round=?z[ledger] A/B u    è¡Œ (æ–°è¦� u   )ã€� å¤‰åŒ– r_   )r   Úbaserc   rd   rI   ÚDIFFrN   rg   rf   Úinputsro   ri   Úwriterj   Ú
startswithÚintÚsplitra   Úappendr   r=   rm   rE   r3   r0   r1   r.   r2   rn   rl   rp   )
rq   r~   ÚresÚchangedrr   r|   Úfr   rv   rw   s
             r   Úcmd_abr‰   k   s™  € Ü�—‘‹=€DÜ
�.‰.Ü	ŒT‹Ðb”Y˜t TÓ*Ðb¬Y´t¸TÓ-BÐbÀHÐbÈbÏgÉgÐbÐXZ×XaÑXaÐbØ $°Àô€Cô ‡J�J×Ñ�S—Z‘ZÔ Ø€GØ�Z‰Z×"Ñ"Ó$ò (ˆØ�<‰<˜
Õ#Ü˜!Ÿ'™'›) A™,Ó'‰Gð(ð €EØ�Y‰Yò /ˆÜ�a 'Ô*ò 	/ˆAØ�L‰L˜Ÿ™  qÓ)¨"Ñ-Õ.ñ	/ð/ô ‹)€CÜ˜3 ¨°·±Ó9�K€Dˆ%Ü��b—h‘h¨%Õ0à‡K�KØMØ	ˆwœŸ™Ÿ™›×1Ñ1Ó3°R·X±XÐ>ôð ‡J�J„LÜ	ˆM˜$˜˜}¨U¨G°<À¸yÐ
IÔPS×PZÑPZÖ[r   c           	     ó6  — t        «       }g }| j                  D ]X  }t        |d¬«      D ]F  }|j                  | j                  dk(  r|j                  dd«      d   n|j                  d«      «       ŒH ŒZ t        || j                  || j                  «      \  }}| j                  dk(  rt        || j                  ||¬	«       nt        || j                  ||¬
«       |j                  «        t        d| j                  › d|› d|› d�t        j                  ¬«       y)uz   å®Ÿè¡Œæ¸ˆã�¿ã�® probe èªžå�¥ / A/B å…¥åŠ›ã‚’ã€� èª­ã�¿ç›´ã�•ã�šã�« ledger ã�¸ç™»éŒ²ã�™ã‚‹ (é�ŽåŽ»åˆ†ã�®å�–ã‚Šè¾¼ã�¿ç”¨)ã€‚r   rP   r|   rY   rz   r{   rR   rZ   r[   )Úlines_inr}   z[ledger] import ú u	    (æ–°è¦� r^   r_   N)r   Úfilesra   r…   Úkindr„   rb   r=   rm   rE   rn   rl   ro   rp   )rq   r   r8   rˆ   rr   rv   rw   s          r   Ú
cmd_importr�   †   sì   € ä
‹)€CØ€EØ�X‰Xò YˆÜ�a 'Ô*ò 	YˆAØ�L‰L°·±¸GÒ1C˜Ÿ™  qÓ)¨"Ò-ÈÏÉÐRVËÕXñ	YðYô ˜3 §¡¨°·±Ó9�K€Dˆ%Ø	‡w�w�'ÒÜ�S˜"Ÿ(™(¨T¸UÖCä�S˜"Ÿ(™(¨T¸UÕCØ‡J�J„LÜ	Ð˜RŸW™W˜I Q t f¨I°e°W¸AÐ
>ÄSÇZÁZÖPr   c                ó  — t        «       }t        || j                  | j                  | j                  ¬«       | j
                  r"t        || j                  | j
                  ¬«       |j                  «        t        | «       y )N)ÚfixedÚcases_addedr?   )r   rE   rm   r‘   Úcasesrn   Ú	cmd_stats)rq   r   s     r   Ú	cmd_roundr•   –   sN   € Ü
‹)€CÜ��b—h‘h b§h¡h¸B¿H¹HÕEØ	‡y‚yÜ�S˜"Ÿ(™(¨r¯y©yÕ9Ø‡J�J„LÜˆb…Mr   c                ó   — t        «       }|j                  d«      j                  «       d   }|j                  d«      j                  «       d   }|j                  d«      j                  «       \  }}}t        d|d›d|d›d|› d	|› d
|› �
«       |j                  d«      D ]-  }t        ddj	                  t        t        |«      «      z   «       Œ/ y )Nzselect count(*) from termsr   zselect count(*) from lineszQselect coalesce(sum(fixed),0), coalesce(sum(cases_added),0), count(*) from roundsu$   ç´¯è¨ˆ (é‡�è¤‡ã�ªã�—): probe èªžå�¥ ú,u    / A/B è¡Œ u
    / ä¿®æ­£ u    / å›žå¸°è¿½åŠ  u    / ãƒ©ã‚¦ãƒ³ãƒ‰ zyselect date, round, terms_new, lines_new, ab_changed, fixed, cases_added, coalesce(commit_sha,'') from rounds order by idz  z | )r   r3   r4   rl   rh   ÚmaprI   )Ú_nsr   Útrr   rˆ   rC   ÚrrB   s           r   r”   r”   Ÿ   sÔ   € Ü
‹)€CØ�‰Ð0Ó1×:Ñ:Ó<¸QÑ?€AØ�‰Ð0Ó1×:Ñ:Ó<¸QÑ?€AØ�k‰kØ[óç�hƒjñ €A€qˆ!ô 
Ð0°°1°°[ÀÀ1ÀÀZÐPQÈsÐRbÐcdÐbeÐeuÐvwÐuxÐ
yÔzØ�{‰{ð	#óò 0ˆô 	ˆd�U—Z‘Z¤¤C¨£Ó.Ñ.Õ/ñ	0r   c                 óÌ  — t         j                  t         j                  fD ]  } | j                  d¬«       Œ t	        j
                  t        j                  «       d   ¬«      }|j                  dd¬«      }|j                  d«      }|j                  d	«       |j                  d
«       |j                  dd¬«       |j                  t        ¬«       |j                  d«      }|j                  d	«       |j                  ddd¬«       |j                  dd¬«       |j                  dd¬«       |j                  t        ¬«       |j                  d	«      }|j                  d	«       |j                  dt        d¬«       |j                  dt        d¬«       |j                  d«       |j                  t        ¬«       |j                  d«      }|j                  d	«       |j                  dddg¬«       |j                  dd¬«       |j                  t         ¬«       |j                  d «      }|j                  t"        ¬«       |j%                  «       }|j'                  |«       y )!Nr   rP   r   )ÚdescriptionÚcmdT)ÚdestÚrequiredÚproberm   r`   rT   Úhiragana)Údefault)ÚfnÚabz--baseuW   A å�´ (å¤‰æ›´å‰�) ã�® dict rootã€‚ ä¾‹: git archive HEAD core rules ã‚’å±•é–‹ã�—ã�Ÿ dir)r    Úhelpr€   ú+)Únargsz--fixed)Útyper£   z--casesz--commitÚimportrŽ   rZ   r|   )Úchoicesr�   Ústats)ro   ri   rp   ÚreconfigureÚargparseÚArgumentParserÚ__doc__rj   Úadd_subparsersÚ
add_parserÚadd_argumentÚset_defaultsrx   r‰   rƒ   r•   r�   r”   Ú
parse_argsr¤   )r&   ÚpÚsprM   rq   s        r   Úmainr¸   ®   sÜ  € Ü�j‰jœ#Ÿ*™*Ð%ò (ˆØ	�‰˜wˆÕ'ð(ä×Ñ¬G×,>Ñ,>Ó,@ÀÑ,CÔD€AØ	
×	Ñ	˜u¨tÐ	Ó	4€BØ
�‰�gÓ€A §¡¨wÔ 7¸¿¹ÈÔ9OØ‡N�N�8 Z€NÔ0°!·.±.ÄI°.Ô2NØ
�‰�dÓ€A˜QŸ^™^¨GÔ4°a·n±nÀXÐX\Øfð 7Eô 7hà‡N�N�8 3€NÔ'¨¯©¸È*¨Ô)UÐWX×WeÑWeÔioÐWeÔWpØ
�‰�gÓ€A §¡¨wÔ 7¸¿¹È	ÔX[Ðef¸Ô9gØ‡N�N�9¤3°€NÔ2°A·N±NÀ:Ô4NÐPQ×P^ÑP^ÔbkÐP^ÔPlØ
�‰�hÓ€A §¡°Ô!8¸!¿.¹.ÈÐZaÐcjÐYk¸.Ô:lØ‡N�N�7 #€NÔ&¨¯©¼*¨Ô(EØ
�‰�gÓ€A §¡´) Ô <Ø	
�‰‹€BØ‡E�Eˆ"…Ir   Ú__main__)Úreturnzsqlite3.Connection)r&   rI   rº   Úbytes)r7   rI   r8   ú	list[str]r-   rI   rº   ztuple[int, int])r-   rI   rº   ÚNone)Ú )rK   r   rL   rI   rº   r¼   )rº   r½   )&r°   Ú
__future__r   r®   Údatetimer0   r   Úosr   rc   ro   r!   Úpathlibr   Ú__file__Úresolver   ÚROOTÚWSr   ÚenvironÚgetrg   re   r   rJ   r   r'   r=   rE   rN   rx   r‰   r�   r•   r”   r¸   Ú__name__r*   r   r   ú<module>rÊ      s  ðñ
õ #ã Û Û Û 	Û Û Û 
Û Ý áˆHƒ~×ÑÓ×&Ñ&×-Ñ-€Ø	‡[�[€Ø	ˆF�]Ð*Ñ*€ÙˆB�J‰J�N‰NÐ/°°oÑ1EÓFÓG€Ù
ˆ2�:‰:�>‰>˜.¨"¨z©/¸HÑ*DÀyÑ*PÐSaÑ*aÓbÓc€ØˆlÑ˜XÑ%¨	Ñ1°OÑC€Ø:€óó [ó#ó\ô*óMó\ó6Qó ó0óð& ˆzÒÙ…Fð r   