
    ^i                         d Z ddlZddlZddlZddlmZ ddlmZ	m
ZmZmZmZ ddlmZm
Z ddlmZm
Z eeegZh dZdd	hZd
dhZddZddZddZ G d dej        j                  Zd Zedk    r e             dS dS )u  启动本地服务器展示 SPX complacency K 线。

用法: python -m sentiment_indicator.web.serve [--port 8080]

自动刷新: 每次 HTTP 请求 /complacency.html 或 /complacency_data.json 时,
检查 CSV/parquet 源 (complacency_score.csv, trade_actions.csv, SPX.parquet)
的 mtime, 若任一源比已生成的 JSON 新就自动 regen JSON, 浏览器刷新页面即可
看到最新数据, 无需重启 server.
    N)Path   )mainOUTPUTSPX_PATH
SCORE_PATHACTIONS_PATH)r   r   >   /complacency.html/complacency_data.json/z/backtest_data.jsonz/backtest.htmlz/trade_actions_data.jsonz/trade_actions.htmlreturnc                  2   t          j                    st          d           t                       dS t          j                    j        fdt          D             } | r6t          dd                    |            d           t                       dS dS )uG   若任一源文件比 JSON 新 (或 JSON 不存在), 重新生成 JSON.z0[auto-refresh] data JSON missing, generating ...Nc                     g | ]:}|                                 r$|                                j        k    3|j        ;S  )existsstatst_mtimename).0src
json_mtimes     @/home/raptorx-1/project/yardeni/sentiment_indicator/web/serve.py
<listcomp>z%_maybe_regenerate.<locals>.<listcomp>/   sK       ::<<HHJJ/*<< 	<<<    z[auto-refresh] stale sources: z, z, regenerating ...)DATA_JSON_PATHr   printgenr   r   SOURCE_PATHSjoin)stale_sourcesr   s    @r   _maybe_regenerater!   (   s     "" @AAA$&&/J   (  M  [tyy/G/G[[[\\\ r   c                  :   t          j                    st          d           t                       dS t          j                    j        } t          j                    r;t          j                    j        | k    r!t          d           t                       dS dS dS )uM   若 trade_actions.csv 比 backtest_data.json 新, 重新生成 backtest JSON.z4[auto-refresh] backtest JSON missing, generating ...NzK[auto-refresh] trade_actions.csv newer than backtest JSON, regenerating ...)BACKTEST_JSON_PATHr   r   gen_backtestr   r   r	   r   s    r   _maybe_regenerate_backtestr&   8   s    $&& DEEE#(**3J !2!4!4!=
!J!J[\\\ !J!Jr   c                  :   t          j                    st          d           t                       dS t          j                    j        } t          j                    r;t          j                    j        | k    r!t          d           t                       dS dS dS )uQ   若 trade_actions.csv 比 trade_actions_data.json 新, 重新生成 actions JSON.z3[auto-refresh] actions JSON missing, generating ...NzJ[auto-refresh] trade_actions.csv newer than actions JSON, regenerating ...)ACTIONS_JSON_PATHr   r   gen_actionsr   r   r	   r%   s    r   _maybe_regenerate_actionsr*   D   s    #%% CDDD"'))2J !2!4!4!=
!J!JZ[[[ !J!Jr   c                        e Zd Z fdZ xZS )RefreshingHandlerc                    | j                             dd          d         }|t          v rt                       n/|t          v rt                       n|t          v rt                       t                      	                                 d S )N?r   r   )
pathsplitREFRESH_TRIGGER_PATHSr!   BACKTEST_TRIGGER_PATHSr&   ACTIONS_TRIGGER_PATHSr*   superdo_GET)selfr/   	__class__s     r   r5   zRefreshingHandler.do_GETQ   s    ysA&&q)(((+++&((((***%'''r   )__name__
__module____qualname__r5   __classcell__)r7   s   @r   r,   r,   P   s8        	 	 	 	 	 	 	 	 	r   r,   c                     t          j                    } |                     dt          d           |                     ddd           |                                 }t          t                                                    j        }d}|j	        rt          j                    st          d	           t                       |j	        rt          j                    st          d
           t                       |j	        rt!          j                    st          d           t#                       t%          j        |           t(          j                            d|j        ft0                    }t          d|j         d|            t          d           t          d           	 |                                 d S # t4          $ r t          d           Y d S w xY w)Nz--porti  )typedefaultz--no-generate
store_trueu8   Skip data generation at startup (auto-refresh 仍生效))actionhelpzcomplacency.htmlzGenerating chart data ...zGenerating backtest data ...z!Generating trade actions data ...z0.0.0.0u"   
🌐 Dashboard: http://localhost:r   uH      自动刷新: 源 CSV/parquet 更新后浏览器刷新页面即生效z   Press Ctrl+C to stop
z
Server stopped.)argparseArgumentParseradd_argumentint
parse_argsr   __file__resolveparentno_generater   r   r   r   r#   r$   r(   r)   oschdirhttpserver
HTTPServerportr,   serve_foreverKeyboardInterrupt)parserargsweb_dir	page_filerN   s        r   r   r   ]   s   $&&F
sD999
W  Y Y YD8nn$$&&-G"I >#8#:#: )*** #5#<#>#> ,--- #4#;#=#= 1222HW[##Y	$:<MNNF	
G	
G
GI
G
GHHH	
TUUU	
%&&&# # # #!""""""#s   (F> >GG__main__)r   N) __doc__rB   http.serverrM   rK   pathlibr   generate_complacency_datar   r   r   r   r   r   r	   generate_backtest_datar$   r#   generate_trade_actions_datar)   r(   r   r1   r2   r3   r!   r&   r*   rN   SimpleHTTPRequestHandlerr,   r8   r   r   r   <module>r_      s         				                                  *l3LLL /1AB 35JK     	 	 	 		 	 	 	
 
 
 
 
< 
 
 
# # #> zDFFFFF r   