
    1_if                         d Z ddlmZmZmZ ddlmZmZmZm	Z	 ddl
m
Z
 ddlmZmZ e G d d             Z G d d	e      Zy
)z<Base collector infrastructure with standardized data format.    )	dataclassasdictfield)ListOptionalDictAny)datetime)ABCabstractmethodc                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZee   ed<    e	e
	      Zeeef   ed
<   de
fdZy)	TrendItemz,Standardized format for all trending topics.
topic_namesourcerankregion	timestampNurl)default_factorymetadatareturnc                     t        |       S )z-Convert to dictionary for JSON serialization.)r   )selfs    9/home/sietch6/trending-topics-pipeline/collectors/base.pyto_dictzTrendItem.to_dict   s    d|    )__name__
__module____qualname____doc__str__annotations__intr   r   r   dictr   r   r	   r    r   r   r   r   	   sO    6OK
IKNC#$T:Hd38n: r   r   c                   R    e Zd ZdZdefdZededee   fd       Z	dedee   fdZ
y)	BaseCollectorz-Abstract base class for all trend collectors.namec                      || _         g | _        y )N)r(   errors)r   r(   s     r   __init__zBaseCollector.__init__   s    	!#r   r   r   c                      y)z
        Collect trending items for a region.

        Args:
            region: Two-letter region code (US, CA)

        Returns:
            List of TrendItem objects
        Nr%   )r   r   s     r   collectzBaseCollector.collect!   s     	r   c           	         	 | j                  |      S # t        $ rb}| j                   d| dt        |       }| j                  j                  |       t        d| j                   d| d|        g cY d}~S d}~ww xY w)z
        Wrapper that catches errors and continues gracefully.

        Args:
            region: Two-letter region code (US, CA)

        Returns:
            List of TrendItem objects, or empty list on error
        :z - z[ERROR] z failed for z: N)r-   	Exceptionr(   r!   r*   appendprint)r   r   e	error_msgs       r   safe_collectzBaseCollector.safe_collect.   sz    	<<'' 	99+Qvhc#a&:IKKy)HTYYK|F82aSABI		s    	A>AA93A>9A>N)r   r   r   r    r!   r+   r   r   r   r-   r5   r%   r   r   r'   r'      sN    7$S $ 
c 
d9o 
 
3 4	? r   r'   N)r    dataclassesr   r   r   typingr   r   r   r	   r
   abcr   r   r   r'   r%   r   r   <module>r9      s?    B 0 0 , ,  #    $C $r   