o
    `šjC  ã                   @   sš  d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dddddddddddddœZg 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 d)d*„ Z!d+d,„ Z"d=d.d/„Z#e$d0krËddl%Z%e%j&d1d2Z'e'j(d3d4d5d6 e'j(d7d4d8d6 e' )¡ Z*e*j+rÃe#d9d:Z,e -e,r¾d¡ dS d¡ dS e#e*j.d; dS dS )>a9  Generate .pyi type stub files for dynamically created protocol classes.

Usage:
    python -m kafka.protocol.generate_stubs           # generate stubs
    python -m kafka.protocol.generate_stubs --check    # exit 1 if stubs are out of date
    python -m kafka.protocol.generate_stubs --dry-run  # print to stdout
é    Né   )ÚApiData)Ú
ApiMessage)ÚDataContainer)ÚSimpleField)Ú
ArrayField)ÚStructField)ÚStructArrayField)ÚclasspropertyÚintÚfloatÚboolÚstrÚbytesz	uuid.UUIDzset[int])Úint8Úint16Úuint16Úint32Úint64Úfloat64r   Ústringr   ÚrecordsÚuuidÚbitfield)zkafka.protocol.admin.aclz"kafka.protocol.admin.client_quotaszkafka.protocol.admin.clusterzkafka.protocol.admin.configszkafka.protocol.admin.groupszkafka.protocol.admin.topicsz!kafka.protocol.admin.transactionszkafka.protocol.admin.userszkafka.protocol.consumer.fetchzkafka.protocol.consumer.groupz kafka.protocol.consumer.metadatazkafka.protocol.consumer.offsetsz$kafka.protocol.metadata.api_versionsz(kafka.protocol.metadata.find_coordinatorz kafka.protocol.metadata.metadatazkafka.protocol.producer.producez#kafka.protocol.producer.transactionzkafka.protocol.saslc                 c   s\    | j du rdS | j jD ]}|V  | ¡ s| ¡ r+t| |jdƒ}|dur+t|ƒE dH  qdS )z1Yield all fields from cls and its nested structs.N)Ú_structÚ_fieldsÚ	is_structÚis_struct_arrayÚgetattrÚtype_strÚ_all_fields_recursive)ÚclsÚfieldÚdc© r$   ú[/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/kafka/protocol/generate_stubs.pyr    >   s   €
€ûr    c                 C   sŽ   t | tƒrd| j }n1t | tƒrt | jjd¡}d| }nt | tƒr&| j}nt | t	ƒr:t | jd¡}| jdv r9d}nd}| j
durEd| S |S )z:Convert a field object to a Python type annotation string.zlist[%s]ÚAny©r   r   zbytes | ApiDataNz	%s | None)Ú
isinstancer	   r   r   ÚSIMPLE_TYPE_MAPÚgetÚarray_ofÚ	_type_strr   r   Ú_nullable_versions)r"   ÚbaseÚinnerr$   r$   r%   Úresolve_typeJ   s    





€
r0   c                 c   sj    | j du rdS tƒ }| j jD ]#}| ¡ s| ¡ r2t| |jdƒ}|dur2||vr2| |¡ ||fV  qdS )z?Yield (field, data_class) pairs for nested struct types on cls.N)r   Úsetr   r   r   r   r   Úadd)r!   Úseenr"   r#   r$   r$   r%   Ú_collect_nested_classesa   s   €


€ûr4   c                 C   s   d| }g }|du rt | tƒrd}n
t | tƒrd}nd}| d|| j|f ¡ |d }t| ƒD ]\}}| t||d dd	¡ | d
¡ q/| jdur`| jj	D ]}t
|ƒ}| d||j|f ¡ qNddg}	| jdur~| jj	D ]}t
|ƒ}|	 d|j|f ¡ qm|	 d¡ |	 d¡ t|	ƒdkr›| d|d |	¡f ¡ n-| d| ¡ t|	ƒD ]\}
}|
t|	ƒd k r´dnd}| d|||f ¡ q¦| d| ¡ | d| ¡ | d| ¡ | d| ¡ |dkrân|dkrít||| ƒ n
|dkr÷t||| ƒ t||| |ƒ |S )z0Generate stub lines for a single protocol class.ú Nr   r   r   z%sclass %s(%s):z    é   )ÚindentÚ	base_nameÚ z%s%s: %sÚselfz
*args: Anyú%s: %s = ...zversion: int | None = Nonez**kwargs: Anyz%sdef __init__(%s) -> None: ...ú, z%sdef __init__(r   ú,z
%s    %s%sz%s) -> None: ...ú%s@propertyz&%sdef version(self) -> int | None: ...zG%sdef to_dict(self, meta: bool = False, json: bool = True) -> dict: ...)Ú
issubclassr   r   ÚappendÚ__name__r4   ÚextendÚ
emit_classr   r   r0   ÚnameÚlenÚjoinÚ	enumerateÚ_emit_api_data_methodsÚ_emit_api_message_methodsÚ_emit_custom_members)r!   r7   r8   ÚpadÚlinesÚ	inner_padr"   r#   Útype_annÚinit_paramsÚiÚparamÚcommar$   r$   r%   rC   n   sT   





rC   c                 C   sJ   |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ dS )z)Emit method stubs for ApiData subclasses.ú%sname: strú%stype: strú!%svalid_versions: tuple[int, int]ú%smin_version: intú%smax_version: intN©r@   ©rL   rK   r!   r$   r$   r%   rH   ¯   s
   rH   c                 C   sº   |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ |   d| ¡ |   d	| ¡ |   d
| ¡ |   d| ¡ |   d| ¡ |   d| ¡ dS )z,Emit method stubs for ApiMessage subclasses.rS   rT   z%sAPI_KEY: intz%sAPI_VERSION: intrU   rV   rW   r>   z%sdef header(self) -> Any: ...ú%s@classmethodz"%sdef is_request(cls) -> bool: ...z(%sdef expect_response(self) -> bool: ...z^%sdef with_header(self, correlation_id: int = 0, client_id: str = "kafka-python") -> None: ...NrX   rY   r$   r$   r%   rI   ¸   s   rI   c                 C   s@   t | tƒr| S t | tƒr| jS t| ƒ}ddl}| dd|¡}|S )zDFormat a type annotation as a clean string, using short class names.r   Nz-[a-zA-Z_][a-zA-Z0-9_.]*\.([A-Z][a-zA-Z0-9_]*)z\1)r(   r   ÚtyperA   ÚreÚsub)ÚannÚsr\   r$   r$   r%   Ú_format_annotationÉ   s   

r`   c                 C   sŠ   d}t | tƒr| j}n!t | tƒr| j}nt | tƒr| j}nt | tƒr&| j}nt| ƒr,| }|durCt	|di ƒ}| 
d¡}|durCt|ƒS dS )zVExtract the return type annotation string from a callable, property, or classproperty.NÚ__annotations__Úreturn)r(   r
   ÚfÚpropertyÚfgetÚclassmethodÚ__func__ÚstaticmethodÚcallabler   r*   r`   )ÚobjÚfuncÚhintsÚretr$   r$   r%   Ú_get_return_annotation×   s"   




rn   c              	   C   s>  d}t | tƒr| j}nt | tƒr| j}nt| ƒr| }|du r dS zt |¡}W n ttfy3   Y dS w g }|j	 
¡ D ]^\}}|dksG|dkrM| |¡ q;|j}|tjju rYd}nt|ƒ}|jtjjurn| d||f ¡ q;|jtjjkr| d||f ¡ q;|jtjjkr| d||f ¡ q;| d||f ¡ q;d	 |¡S )
zWExtract parameter annotations from a callable, returning (params_str, has_annotations).Nr:   r!   r&   r;   z*%s: %sz**%s: %sú%s: %sr<   )r(   rf   rg   rh   ri   ÚinspectÚ	signatureÚ
ValueErrorÚ	TypeErrorÚ
parametersÚitemsr@   Ú
annotationÚ	ParameterÚemptyr`   ÚdefaultÚkindÚVAR_POSITIONALÚVAR_KEYWORDrF   )rj   rk   ÚsigÚpartsÚpnamerQ   r^   Úann_strr$   r$   r%   Ú_get_param_annotationsí   s>   

ÿ

r   c           
      C   s˜  h d£}|dkrt }n	|dkrt}nt}|j ¡ D ]°\}}| d¡s&||v r'q|dv r1t||ƒr1qt|tƒr7qt|ƒj	dkr?qt
|ƒpDd}t|tƒr\|  d| ¡ |  d	|||f ¡ qt|tƒrs|  d| ¡ |  d	|||f ¡ qt|tƒr‘t|ƒp}d
}	|  d| ¡ |  d|||	|f ¡ qt|tƒr¯t|ƒp›d}	|  d| ¡ |  d|||	|f ¡ qt|ƒrÉt|tƒsÉt|ƒp½d}	|  d|||	|f ¡ qdS )z}Emit stubs for custom members defined directly on the class.

    Reads type annotations from the source when available.
    >   Ú_jsonÚ__doc__r   Ú__dict__Ú	_VERSIONSÚ
__module__Ú
json_patchÚ__license__Ú__weakref__Ú__qualname__Ú_class_versionÚ_valid_versionsÚ__init_subclass__Ú_flexible_versionsr   r   Ú_)ÚencodeÚdecodeÚencode_intoÚmember_descriptorr&   r>   z%sdef %s(self) -> %s: ...zcls, *args: Any, **kwargs: AnyrZ   z%sdef %s(%s) -> %s: ...z*args: Any, **kwargs: Anyz%s@staticmethodzself, *args: Any, **kwargs: AnyN)r   r   r   r„   ru   Ú
startswithÚhasattrr(   r[   rA   rn   r
   r@   rd   rf   r   rh   ri   )
rL   rK   r!   r8   Úskipr.   rD   rj   rm   Úparamsr$   r$   r%   rJ     sF   




€ârJ   c                  C   sd   i } t D ]+}t |¡}t |¡}t|dg ƒ}g }|D ]}t||ƒ}| ||f¡ q||f| |< q| S )zƒImport all message modules and collect their exports.

    Returns dict mapping module file path to list of (name, obj) pairs.
    Ú__all__)ÚMESSAGE_MODULESÚ	importlibÚimport_modulerp   Úgetfiler   r@   )ÚresultÚmod_nameÚmodÚmod_fileÚ	all_namesÚexportsrD   rj   r$   r$   r%   Údiscover_modulesF  s   


r£   c                 C   sÌ  g }|  dtjdd…  ¡ |  d¡ |  d¡ |  d¡ ddlm} d	}d	}d	}d	}|D ]\}}	t|	tƒrLt|	tƒr>d
}nt|	t	ƒrEd
}t|	|ƒrLd
}q-|D ]0\}}	t|	tƒrt
|	dƒr|	jdurt|	ƒD ]}
|
 ¡ sp|
 ¡ rrd
}t|
tƒr~|
jdv r~d
}qfqO|r‡|  d¡ |rŽ|  d¡ |r•|  d¡ |rœ|  d¡ |s¤|s¤|s¤|r©|  d¡ dd„ |D ƒ}|  dd dd„ |D ƒ¡ ¡ |  d¡ |D ]š\}}	t|	tƒræt|	tƒræ|	jduræ| t|	ƒ¡ |  d¡ qÆt|	tƒrMddlm} dd„ |	jD ƒ}|rdd |¡ nd}|  d||f ¡ dd„ |	j ¡ D ƒ}|rB| ¡ D ] \}}t|	|ƒr3|  d| ¡ q |  d|t|ƒjf ¡ q n|  d¡ |  d¡ qÆt|	ƒj}|  d||f ¡ |  d¡ qÆd  |¡S )!z5Generate the complete .pyi file content for a module.z/# Generated by generate_stubs.py (Python %d.%d)Né   zimport uuidzfrom typing import Any, Selfr9   r   )ÚIntEnumFTr   r'   zfrom enum import IntEnumz1from kafka.protocol.api_message import ApiMessagez+from kafka.protocol.api_data import ApiDataz7from kafka.protocol.data_container import DataContainerc                 S   s   g | ]\}}|‘qS r$   r$   )Ú.0rD   rj   r$   r$   r%   Ú
<listcomp>„  s    z#generate_module.<locals>.<listcomp>z__all__ = [%s]r<   c                 s   s    | ]}d | V  qdS )z'%s'Nr$   )r¦   Únr$   r$   r%   Ú	<genexpr>…  s   € z"generate_module.<locals>.<genexpr>c                 S   s   g | ]	}|t ur|j‘qS r$   )ÚobjectrA   )r¦   Úbr$   r$   r%   r§     s    z(%s)zclass %s%s:c                 S   s(   i | ]\}}|  d ¡st|ƒs||“qS )r   )r”   ri   )r¦   ÚkÚvr$   r$   r%   Ú
<dictcomp>“  s
    ÿÿz#generate_module.<locals>.<dictcomp>z    %s: intz
    %s: %sz    ...ro   Ú
)r@   ÚsysÚversion_infoÚenumr¥   r(   r[   r?   r   r   r•   r   r    r   r   r   r,   rF   r   rB   rC   Ú	__bases__r„   ru   rA   )rŸ   r¢   rL   Ú_IntEnumÚneeds_api_messageÚneeds_api_dataÚneeds_data_containerÚneeds_int_enumrD   rj   r"   r¡   ÚbasesÚbase_strÚmembersr¬   r­   Ú	type_namer$   r$   r%   Úgenerate_moduleX  s|   






€€





û


r½   Fc              	   C   s  t ƒ }d}t| ¡ ƒD ]x\}\}}t||ƒ}| dd¡}| r,td| ƒ t|ƒ tƒ  q|rctj |¡rZt	|dƒ}	|	 
¡ }
W d  ƒ n1 sHw   Y  |
|krYtd| ƒ d}qtd	| ƒ d}qt	|d
ƒ}	|	 |¡ W d  ƒ n1 sxw   Y  td| ƒ q|S )zBGenerate all stub files. Returns True if all stubs are up to date.Tz.pyz.pyiz# %sÚrNzOUTDATED: %sFzMISSING: %sÚwzGenerated: %s)r£   Úsortedru   r½   ÚreplaceÚprintÚosÚpathÚexistsÚopenÚreadÚwrite)Údry_runÚcheckÚmodulesÚall_up_to_dater    rŸ   r¢   ÚcontentÚpyi_pathrc   Úexistingr$   r$   r%   Úgenerate_all¨  s2   

ÿ€ÿrÐ   Ú__main__z(Generate .pyi stubs for protocol classes)Údescriptionz--checkÚ
store_truez-Check if stubs are up to date (exit 1 if not))ÚactionÚhelpz	--dry-runz(Print to stdout instead of writing filesT)rÊ   )rÉ   )r   N)FF)/rƒ   rš   rp   rÃ   r°   Úapi_datar   Úapi_messager   Údata_containerr   Úschemas.fields.simpler   Úschemas.fields.arrayr   Úschemas.fields.structr   Úschemas.fields.struct_arrayr	   Ú
kafka.utilr
   r)   r™   r    r0   r4   rC   rH   rI   r`   rn   r   rJ   r£   r½   rÐ   rA   ÚargparseÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsrÊ   Ú
up_to_dateÚexitrÉ   r$   r$   r$   r%   Ú<module>   sn    ô
A	'2
Pÿÿ
ó