
    }f                     (   d dl Z d dlmZ d dlmZ d dlmZmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZmZ dd	lmZ d
e z   dz   Z edddg      ZdZddZd Zd Zd Z G d de      Z G d de      Z G d de
      Z G d de      Z G d de      Zy)    N)
namedtuple)datetime)compress_seqindentre	safe_name   )CodeGeneratorModelRenderer)CodegenError)BASE_CLASS_TOKENNode)Rendererz
(?!\d)\w+(z(?!\d)\w+)*TypeSpec
class_namebasez6
@dataclass(eq=False)
class ModelBase(Node):
    pass
c                 8    t               j                  | |      S )N)	base_type)ObjectModelCodeGeneratorrender)modelr   s     X/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/tatsu/codegen/objectmodel.pycodegenr      s    #%,,Ui,HH    c                     | j                   sy | j                   d   }t        |t              sy t        j                  t
        |      sy |d   j                         sy |S )Nr   )params
isinstancestrr   matchNODE_NAME_PATTERNisupper)ruletypespecs     r   _get_node_class_namer$      sP    ;;{{1~Hh$88%x0A; Or   c                    t        |       sg S | j                  d   j                  t              }|D cg c]  }t	        |       c}dgz   }g }t        |d d       D ](  \  }}||dz      }|j                  t        ||             * |S c c}w )Nr   	ModelBase   )r$   r   splitr   r   	enumerateappendr   )r"   specnclass_namesr#   ir   r   s           r   	_typespecr0   *   s    %	;;q> 01D)-.A9Q<.+>KH";s#34 4:1q5!T234 O /s   B
c                 v   t        j                  |       st        d      t        j                  |       }|st        d      |j                  }| j
                  }	 |j                  d      }t        ||d         }|dd  D ]  }t        ||      } || k(  sJ 	 ||fS # t        $ r}t        d      |d }~ww xY w)NzBase type has to be a classz#Base type has to be inside a module.r   r(   z0Couldn't find base type, it has to be importable)	inspectisclassr   	getmodule__name____qualname__r)   getattrAttributeError)clsmodule
modulenamenameidents_clsidentes           r   _get_full_namerB   9   s    ??3899s#F@AAJD
Cvvay)ABZ 	(E4'D	( s{{ t  >
	s   =B 	B8'B33B8c                   (     e Zd Z fdZd ZdZ xZS )BaseTypeRendererc                 0    t         |           || _        y N)super__init__r   )selfr   	__class__s     r   rH   zBaseTypeRenderer.__init__T   s    "r   c                     t        | j                        \  }}d|v rd| }|j                  d      d   }nd}|j                  |||       y )Nr2   z
ModelBase = r   z as ModelBase)r;   r=   lookup)rB   r   r)   update)rI   fieldsr;   r=   rL   s        r   render_fieldszBaseTypeRenderer.render_fieldsX   sP    %dnn5$;%dV,F::c?1%D$FV$v>r   z4
        from {module} import {name}{lookup}        )r6   
__module__r7   rH   rO   template__classcell__rJ   s   @r   rD   rD   S   s    #?Hr   rD   c                   "     e Zd Z fdZdZ xZS )BaseClassRendererc                 f    t         |           |j                  | _        |j                  | _        y rF   )rG   rH   r   r   )rI   r,   rJ   s     r   rH   zBaseClassRenderer.__init__h   s$    //II	r   zZ
        @dataclass(eq=False)
        class {class_name}({base}):
            pass        )r6   rP   r7   rH   rQ   rR   rS   s   @r   rU   rU   g   s    
Hr   rU   c                       e Zd Zd Zy)r   c                     t        |t              sy |j                  j                  }t	               j                  |      }|rt        |t              st        d| d      |S )NzRenderer for z
 not found)	r   r   rJ   r6   globalsget
issubclassr   r   )rI   noder=   renderers       r   _find_renderer_classz-ObjectModelCodeGenerator._find_renderer_classu   sS    $%~~&&9==&z(MBtfJ?@@r   N)r6   rP   r7   r^    r   r   r   r   t   s    r   r   c                       e Zd Zd ZdZy)Rulec                 Z   t        | j                               D cg c]  \  }}t        |       }}}t        t	        |            }|d   }dj                  d |D              }|rt        |      n
t        d      }|j                  |j                  |j                  |       y c c}}w )Nr,   
c              3   &   K   | ]	  }| d   yw)z: Any = NoneNr_   ).0ds     r   	<genexpr>z%Rule.render_fields.<locals>.<genexpr>   s     <!aS-<s   pass)r   r   kwargs)
r   definesr   sortedsetjoinr   rM   r   r   )rI   rN   rf   _defsr,   ri   s          r   rO   zRule.render_fields   s    )5dlln)EFA	!FFc$i f~<t<<#)vf~TYYv 	 	
 Gs   B'zZ
        @dataclass(eq=False)
        class {class_name}({base}):
        {kwargs}        Nr6   rP   r7   rO   rQ   r_   r   r   ra   ra      s    

Hr   ra   c                       e Zd Zd ZdZy)Grammarc           	      H   t               g }g }| j                  j                  D ]v  }t        |      }|s|d   }t	        |dd        }|j
                  vr|j                  ||f       |j                  fd|D               j                  d |D               x |D cg c]  }t        |      j                          }	}|D cg c]&  \  }}| j                  |      j                  |      ( }
}}dj                  |	      }	|	r|	dz  }	dj                  |
      }
t        j                         j                  d      }|d	   }|j                  | j                  j                   |	|
||rt#        |      j                         
       y t$        
       y c c}w c c}}w )Nr   r(   c              3   >   K   | ]  }|j                   vr|  y wrF   r   )re   r   node_class_namess     r   rg   z(Grammar.render_fields.<locals>.<genexpr>   s&      ??*:: s   c              3   4   K   | ]  }|j                     y wrF   ru   )re   ss     r   rg   z(Grammar.render_fields.<locals>.<genexpr>   s     #@QALL#@s   )r,   z


z

z%Y.%m.%d.%Hr   )r=   base_class_declarationsmodel_class_declarationsversionr   )rl   r\   rulesr0   reversedr   r+   extendrM   rU   r   get_rendererrm   r   nowstrftimer=   rD   DEFAULT_BASE_TYPE)rI   rN   basesmodel_rulesr"   specs	node_spec	base_specr,   ry   rz   r{   r   rv   s                @r   rO   zGrammar.render_fields   s   5IIOO 	ADdOEaI qr+I##+;;""D)#45LL %  ###@%#@@#	A( :?#
15d#**,#
 #
 *$
d d#***5$
  $

 #+--0G"H"#v-##+==1I#J ,,.))-8;'	$;%= 'y188: 	 	
 # 	 	
%#
$
s   # F
+Fa                  #!/usr/bin/env python

                # CAVEAT UTILITOR
                #
                # This file was automatically generated by TatSu.
                #
                #    https://pypi.python.org/pypi/tatsu/
                #
                # Any changes you make to it will be overwritten the next time
                # the file is generated.

                from __future__ import annotations

                from typing import Any
                from dataclasses import dataclass

                from tatsu.objectmodel import Node
                from tatsu.semantics import ModelBuilderSemantics

                {base_type}

                class {name}ModelBuilderSemantics(ModelBuilderSemantics):
                    def __init__(self, context=None, types=None):
                        types = [
                            t for t in globals().values()
                            if type(t) is type and issubclass(t, ModelBase)
                        ] + (types or [])
                        super().__init__(context=context, types=types)

                {base_class_declarations}
                {model_class_declarations}
                Nrp   r_   r   r   rr   rr      s    2
h Hr   rr   rF   )r3   collectionsr   r   
tatsu.utilr   r   r   r   codegen.cgbaser
   r   
exceptionsr   objectmodelr   r   	renderingr   r    r   r   r   r$   r0   rB   rD   rU   r   ra   rr   r_   r   r   <module>r      s     "  : : 9 % 0  !(8'9:^K  j<"89 I4x (
 
	} 	= (Um Ur   