Ë
    èlÖi/<  ã                   ó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Zd dl	Z	d dl
Zd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z) d dl*m+Z+ dZ,dZ-ddgZ.ej^                  ej`                  ejb                  ejd                  ddœZ3 G d„ de$«      Z4y)é    N)ÚPath)ÚOptional)Úget_include_pathsÚload_plugin)Úread_profile)Ú
Identifier)
ÚConfigFolderDirectoryÚInvalidProfileTemplateYAMLÚNoSampleProfileFoundÚ%ProfileWrittenWithProjectTemplateYAMLÚProfileWrittenWithSampleÚ$ProfileWrittenWithTargetTemplateYAMLÚProjectCreatedÚProjectNameAlreadyExistsÚSettingUpProfileÚStarterProjectPath)Ú	get_flags)ÚBaseTaskÚmove_to_nearest_project_dir)Ú_get_adapter_plugin_names)Ú
fire_event)ÚDbtRuntimeErrorz3https://docs.getdbt.com/docs/configure-your-profilezhttps://community.getdbt.com/z__init__.pyÚ__pycache__)ÚstringÚintÚfloatÚboolNc                   óü   — e Zd Zdeddfd„Zdedefd„Zdedefd	„Zi fd
ededefd„Z	defd„Z
dedefd„Zd
edefd„Zdedefd„Zdedefd„Zddee   defd„Zd„ Zdefd„Zdeddfd„Zdefd„Zdedefd„Zd„ Zy)ÚInitTaskÚproject_nameÚreturnNc                 ó’   — ddl m} t        t        |¬«      «       t	        j
                  ||t	        j                  t        Ž ¬«       y )Nr   )ÚPACKAGE_PATH©Údir)Úignore)Údbt.include.starter_projectr#   r   r   ÚshutilÚcopytreeÚignore_patternsÚIGNORE_FILES)Úselfr    Ústarter_project_directorys      úR/var/www/html/strategist-ai/venv_dbt/lib/python3.12/site-packages/dbt/task/init.pyÚcopy_starter_repozInitTask.copy_starter_repo5   s7   € õ	
ô 	Ô%Ð*CÔDÔEÜ�‰Ø% |¼F×<RÑ<RÔT`Ð<aö	
ó    Úprofiles_dirc                 óÊ   — t        |«      }|j                  «       sHt        t        t	        |«      ¬«      «       t
        j                  j                  j                  |«       yy)zACreate the user's profiles directory if it doesn't already exist.r$   TF)	r   Úexistsr   r	   ÚstrÚ
dbt_commonÚclientsÚsystemÚmake_directory)r,   r1   Úprofiles_paths      r.   Úcreate_profiles_dirzInitTask.create_profiles_dir@   sK   € ä˜\Ó*ˆØ×#Ñ#Ô%ÜÔ,´°\Ó1BÔCÔDÜ×Ñ×%Ñ%×4Ñ4°\ÔBØØr0   ÚadapterÚprofile_namec                 ó  — t        |«       t        |«      d   }|dz  }|j                  «       st        t	        |¬«      «       yt        |d«      5 }|j                  «       }ddd«       t        t        j                  «      j                  «       «      d   }t        j                  d|› d�|› d�|«      }t        t        «       j                  «      t        d«      z  }|j                  «       r*t        |d	«      5 }|j!                  d
|z   «       ddd«       yt        |d«      5 }|j!                  |«       ddd«       t        t#        |t%        |«      ¬«      «       y# 1 sw Y   ŒÿxY w# 1 sw Y   yxY w# 1 sw Y   ŒAxY w)z�Create a profile entry using the adapter's sample_profiles.yml

        Renames the profile in sample_profiles.yml to match that of the project.r   zsample_profiles.yml)r;   ÚrNú^ú:úprofiles.ymlÚaú
Úw©ÚnameÚpath)r   r   r3   r   r   ÚopenÚreadÚlistÚyamlÚ	safe_loadÚkeysÚreÚsubr   r   ÚPROFILES_DIRÚwriter   r4   )	r,   r;   r<   Úadapter_pathÚsample_profiles_pathÚfÚsample_profileÚsample_profile_nameÚprofiles_filepaths	            r.   Úcreate_profile_from_samplez#InitTask.create_profile_from_sampleI   sa  € ô
 	�GÔÜ(¨Ó1°!Ñ4ˆØ+Ð.CÑCÐà#×*Ñ*Ô,ÜÔ+°GÔ<Õ=äÐ*¨CÓ0ð *°AØ!"§¡£�÷*ä"&¤t§~¡~°nÓ'E×'JÑ'JÓ'LÓ"MÈaÑ"PÐô  ŸV™V aÐ(;Ð'<¸AÐ$>À<À.ÐPQÐ@RÐTbÓcˆNÜ $¤Y£[×%=Ñ%=Ó >ÄÀnÓAUÑ UÐØ ×'Ñ'Ô)ÜÐ+¨SÓ1ð 3°QØ—G‘G˜D >Ñ1Ô2÷3ð 3ô Ð+¨SÓ1ð ,°QØ—G‘G˜NÔ+÷,äÜ,°,ÄSÐIZÓE[Ô\õ÷*ð *ú÷3ð 3ú÷,ð ,ús$   ÁE Ã<E,Ä&E8Å E)Å,E5Å8FÚprofile_templateÚtargetc                 ó  — t        j                  |«      }|j                  «       D �]Z  \  }}|j                  d«      r±|dd j	                  dd«      }t        |j                  «       «      }dj                  t        |«      D ��	cg c]  \  }}	d|dz   › d	|	› �‘Œ c}	}«      d
|› d�z   }
t        j                  |
t        j                  ¬«      }||dz
     }| j                  ||   |   |«      }ŒÉ|j                  d«      r	|||dd <   Œã|j                  dd«      }|j                  dd«      }|j                  dd«      }t        |j                  dd«         }||rd|› d�ndz   }t        j                  ||||¬«      ||<   �Œ] |S c c}	}w )zEGenerate a target configuration from profile_template and user input.Ú_chooseé   NÚ_ú rC   ú[é   ú] z	
Desired z option (enter a number)©ÚtypeÚ_fixedé   Ú
hide_inputFÚdefaultÚhintrd   z (ú)Ú )rh   rg   rd   )ÚcopyÚdeepcopyÚitemsÚ
startswithÚreplacerJ   rM   ÚjoinÚ	enumerateÚclickÚpromptÚINTÚgenerate_target_from_inputÚgetÚclick_type_mapping)r,   rY   rZ   Úprofile_template_localÚkeyÚvalueÚchoice_typeÚoption_listÚnÚvÚ
prompt_msgÚnumeric_choiceÚchoicerg   rh   ri   rd   Útexts                     r.   rv   z#InitTask.generate_target_from_inputf   sŒ  € ä!%§¡Ð/?Ó!@ÐØ0×6Ñ6Ó8ó 	‰JˆC�Ø�~‰~˜iÔ(Ø! ! "˜gŸo™o¨c°3Ó7�Ü" 5§:¡:£<Ó0�à—I‘I¼)ÀKÓ:P×Q±$°!°Q  1 Q¡3 % r¨!¨š~ÓQÓRØ" ; -Ð/GÐHñIð ô "'§¡¨j¼u¿y¹yÔ!I�Ø$ ^°aÑ%7Ñ8�à×8Ñ8Ø*¨3Ñ/°Ñ7¸ó‘ð —>‘> (Ô+à&+�F˜3˜q˜r˜7’Oà!&§¡¨<¸Ó!?�JØ#Ÿi™i¨	°4Ó8�GØ Ÿ9™9 V¨TÓ2�DÜ-¨e¯i©i¸ÀÓ.EÑF�DØ±$ B t f¨A¡,¸BÑ?�DÜ"'§,¡,Ø g¸*È4ô#�F˜3“Kð1	ð6 ˆùó- Rs   ÂFc                 ó~   — t        d«      5 }t        j                  |«      }ddd«       |d   S # 1 sw Y   d   S xY w)z]Reads dbt_project.yml in the current directory to retrieve the
        profile name.
        údbt_project.ymlNÚprofile)rH   rK   rL   )r,   rT   Údbt_projects      r.   Ú%get_profile_name_from_current_projectz.InitTask.get_profile_name_from_current_project†   sC   € ô Ð#Ó$ð 	,¨ÜŸ.™.¨Ó+ˆK÷	,à˜9Ñ%Ð%÷	,à˜9Ñ%Ð%ús   Œ/¯<r†   c                 ój  — t        t        «       j                  «      t        d«      z  }||i}|j                  «       r3t	        |d«      5 }t        j                  |«      xs i }|||<   ddd«       t	        |d«      5 }t        j                  ||«       ddd«       y# 1 sw Y   Œ5xY w# 1 sw Y   yxY w)z~Given a profile, write it to the current project's profiles.yml.
        This will overwrite any profile with a matching name.rA   r>   NrD   )r   r   rP   r3   rH   rK   rL   Údump)r,   r†   r<   rW   ÚprofilesrT   s         r.   Úwrite_profilezInitTask.write_profileŽ   s­   € ô !¤£×!9Ñ!9Ó:¼TÀ.Ó=QÑQÐà  'Ð*ˆà×#Ñ#Ô%ÜÐ'¨Ó-ð 1°ÜŸ>™>¨!Ó,Ò2°�Ø)0�˜Ñ&÷1ô
 Ð# SÓ)ð 	#¨QÜ�I‰I�h Ô"÷	#ð 	#÷1ð 1ú÷
	#ð 	#ús   Á
BÁ=B)ÂB&Â)B2c                 óÆ   — |j                  di «      }|j                  di «      }| j                  ||«      }|j                  dd«      }||i|dœ}| j                  ||«       y)z?Create and write a profile using the supplied profile_template.ÚfixedÚpromptsrZ   Údev)ÚoutputsrZ   N)rw   rv   ÚpoprŒ   )r,   rY   r<   Úinitial_targetr�   rZ   Útarget_namer†   s           r.   Ú$create_profile_from_profile_templatez-InitTask.create_profile_from_profile_templateŸ   sg   € à)×-Ñ-¨g°rÓ:ˆØ"×&Ñ& y°"Ó5ˆØ×0Ñ0°¸.ÓIˆØ—j‘j ¨5Ó1ˆØ*¨FÐ3¸{ÑKˆØ×Ñ˜7 LÕ1r0   c                 ó¤  — t        |«       t        |«      d   }|dz  }|j                  «       r„t        |«      5 }t	        j
                  |«      }ddd«       | j                  |«       t        t        «       j                  «      t        d«      z  }t        t        |t        |«      ¬«      «       y| j                  ||«       y# 1 sw Y   ŒwxY w)z�Create a profile without defaults using target's profile_template.yml if available, or
        sample_profiles.yml as a fallback.r   úprofile_template.ymlNrA   rE   )r   r   r3   rH   rK   rL   r•   r   r   rP   r   r   r4   rX   )r,   r;   r<   rR   Úprofile_template_pathrT   rY   rW   s           r.   Úcreate_profile_from_targetz#InitTask.create_profile_from_target¨   s½   € ô 	�GÔÜ(¨Ó1°!Ñ4ˆØ ,Ð/EÑ EÐà ×'Ñ'Ô)ÜÐ+Ó,ð 5°Ü#'§>¡>°!Ó#4Ð ÷5à×5Ñ5Ð6FÈÔUÜ $¤Y£[×%=Ñ%=Ó >ÄÀnÓAUÑ UÐÜÜ4Ø%¬CÐ0AÓ,Bôõð ×+Ñ+¨G°\ÕB÷5ð 5ús   ºCÃCc                 óH   — t        «       j                  }t        |«      }||v S )z¡
        Validate that the specified profile exists. Can't use the regular profile validation
        routine because it assumes the project file exists
        )r   rP   r   )r,   r<   r1   Úraw_profiless       r.   Úcheck_if_profile_existsz InitTask.check_if_profile_exists¿   s&   € ô
 !“{×/Ñ/ˆÜ# LÓ1ˆØ˜|Ð+Ð+r0   c                 ót  — t        t        «       j                  «      t        d«      z  }|j                  «       sy|xs | j	                  «       }t        |d«      5 }t        j                  |«      xs i }ddd«       |j                  «       v rt        j                  d|› d|› d�«      }|S y# 1 sw Y   Œ:xY w)zËUsing either a provided profile name or that specified in dbt_project.yml,
        check if the profile already exists in profiles.yml, and if so ask the
        user whether to proceed and overwrite it.rA   Tr>   NzThe profile z already exists in z. Continue and overwrite it?)r   r   rP   r3   rˆ   rH   rK   rL   rM   rs   Úconfirm)r,   r<   Úprofiles_filerT   r‹   Úresponses         r.   Úcheck_if_can_write_profilez#InitTask.check_if_can_write_profileÈ   s³   € ô œY›[×5Ñ5Ó6¼¸nÓ9MÑMˆØ×#Ñ#Ô%ØØ#ÒS t×'QÑ'QÓ'SˆÜ�- Ó%ð 	/¨Ü—~‘~ aÓ(Ò.¨BˆH÷	/à˜8Ÿ=™=›?Ñ*Ü—}‘}Ø˜|˜nÐ,?Ø �/Ð!=ð?óˆHð ˆOà÷	/ð 	/ús   ÁB.Â.B7c                 ó"  — t        d«      5 }t        j                  |«      }ddd«       | j                  |«       t	        t        «       j                  «      t	        d«      z  }t        t        |t        |«      ¬«      «       y# 1 sw Y   ŒdxY w)z9Create a profile using the project's profile_template.ymlr—   NrA   rE   )
rH   rK   rL   r•   r   r   rP   r   r   r4   )r,   r<   rT   rY   rW   s        r.   Ú-create_profile_using_project_profile_templatez6InitTask.create_profile_using_project_profile_templateÛ   sw   € äÐ(Ó)ð 	1¨QÜ#Ÿ~™~¨aÓ0Ð÷	1à×1Ñ1Ð2BÀLÔQÜ ¤£×!9Ñ!9Ó:¼TÀ.Ó=QÑQÐÜÜ1°|Ì#ÐN_ÓJ`Ôaõ	
÷		1ð 	1ús   ŒBÂBc                 óL  — t        t        «       «      }|st        j                  j	                  «       ‚ddj                  t        |«      D ��cg c]  \  }}d|dz   › d|› �‘Œ c}}«      z   dz   dz   }t        j                  |t        j                  ¬«      }||dz
     S c c}}w )	z9Ask the user which adapter (database) they'd like to use.z&Which database would you like to use?
rC   r`   ra   rb   zO

(Don't see the one you want? https://docs.getdbt.com/docs/available-adapters)z

Enter a numberrc   )
rJ   r   ÚdbtÚ
exceptionsÚNoAdaptersAvailableErrorrq   rr   rs   rt   ru   )r,   Úavailable_adaptersr~   r   r€   r�   s         r.   Úask_for_adapter_choicezInitTask.ask_for_adapter_choiceå   s§   € ä!Ô";Ó"=Ó>Ðá!Ü—.‘.×9Ñ9Ó;Ð;ð 6Ø�i‰i´IÐ>PÓ4Q×R©D¨A¨q˜1˜Q˜q™S˜E  A 3šÓRÓSñTàañbð #ñ#ð 	ô Ÿ™ j´u·y±yÔAˆØ! .°1Ñ"4Ñ5Ð5ùó Ss   ÁB c                 ó6  — t        t        «       «       | j                  |¬«      syt        d«      }|j	                  «       r	 | j                  |«       y| j                  «       }| j                  ||¬«       y# t        $ r t        t        «       «       Y ŒBw xY w)z"Set up a new profile for a project)r<   Nr—   )
r   r   r¡   r   r3   r£   Ú	Exceptionr
   r©   r™   )r,   r<   r˜   r;   s       r.   Úsetup_profilezInitTask.setup_profileõ   s”   € äÔ#Ó%Ô&Ø×.Ñ.¸LÐ.ÔIØô !%Ð%;Ó <ÐØ ×'Ñ'Ô)ð9ð ×BÑBÀ<ÔPØð ×-Ñ-Ó/ˆØ×'Ñ'¨¸lÐ'ÕKøô ò 9ÜÔ5Ó7Ö8ð9ús   ÁA9 Á9BÂBc                 óf  — ddl m} | j                  j                  }|h}t	        t        «       «      }|D ]  }|j                  d|› �«       Œ t        j                  |«      r||v rJ|rt        j                  |dz   «       t        j                  d«      }t        j                  |«      sŒE||v rŒJ|S )zAReturns a valid project name, either from CLI arg or user prompt.r   )ÚPROJECT_NAMEÚdbt_z is not a valid project name.z;Enter a name for your project (letters, digits, underscore))Údbt.include.global_projectr®   Úargsr    rJ   r   ÚupdateÚProjectNameÚis_validrs   Úechort   )r,   ÚGLOBAL_PROJECT_NAMErF   Úinternal_package_namesr¨   Úadapter_names         r.   Úget_valid_project_namezInitTask.get_valid_project_name  s®   € õ 	Sà�y‰y×%Ñ%ˆØ"5Ð!6ÐÜ!Ô";Ó"=Ó>ÐØ.ò 	AˆLØ"×)Ñ)¨D°°Ð*?Õ@ð	Aä×&Ñ& tÔ,°Ð8NÑ0NÙÜ—
‘
˜4Ð"AÑAÔBÜ—<‘<Ð ]Ó^ˆDô ×&Ñ& tÕ,°Ð8NÒ0Nð
 ˆr0   c                 óx  — | j                  |«       t        j                  |«       t        dd«      5 }|j	                  «       › j                  ||¬«      }d d d «       t        dd«      5 }|j                  «       d d d «       t        t        |t        t        ¬«      «       y # 1 sw Y   ŒOxY w# 1 sw Y   Œ5xY w)Nr…   r>   )r    r<   rD   )r    Údocs_urlÚ	slack_url)r/   ÚosÚchdirrH   rI   ÚformatrQ   r   r   ÚDOCS_URLÚ	SLACK_URL)r,   r    r<   rT   Úcontents        r.   Úcreate_new_projectzInitTask.create_new_project  s§   € Ø×Ñ˜|Ô,Ü
�‰�ÔÜÐ# SÓ)ð 	a¨QØŸ™›˜
×*Ñ*¸ÐS_Ð*Ó`ˆG÷	aäÐ# SÓ)ð 	¨QØ�G‰G�GÔ÷	äÜØ)Ü!Ü#ôõ	
÷		að 	aú÷	ð 	ús   ³#B$Á*B0Â$B-Â0B9c                 ó@  — t        «       j                  }| j                  |«       	 t        | j                  j
                  «       d}|r[| j                  j                  rt        d¬«      ‚| j                  j                  s"| j                  «       }| j                  |«       yy| j                  «       }t        |«      }|j                  «       rt!        t#        |¬«      «       y| j                  j                  }|r?| j%                  |«      st        dj'                  |«      ¬«      ‚| j)                  ||«       y|}| j)                  ||«       | j                  j                  s| j                  |«       yy# t        j                  j                  $ r d}Y �ŒTw xY w)zEntry point for the init task.TFzRCan not init existing project with specified profile, edit dbt_project.yml instead)Úmsg)rF   Nz!Could not find profile named '{}')r   rP   r:   r   r±   Úproject_dirr5   r¦   r   r†   Úskip_profile_setuprˆ   r¬   r¹   r   r3   r   r   rœ   r¿   rÃ   )r,   r1   Ú
in_projectr<   r    Úproject_pathÚuser_profile_names          r.   ÚrunzInitTask.run)  ss  € ä “{×/Ñ/ˆØ× Ñ  Ô.ð	Ü'¨¯	©	×(=Ñ(=Ô>ØˆJñ ð �y‰y× Ò Ü%Ølôð ð —9‘9×/Ò/Ø#×IÑIÓK�Ø×"Ñ" <Õ0ð 0ð  ×6Ñ6Ó8ˆLÜ Ó-ˆLØ×"Ñ"Ô$ÜÔ3¸ÔFÔGØð !%§	¡	× 1Ñ 1ÐÙ Ø×3Ñ3Ð4EÔFÜ)Ø?×FÑFÐGXÓYôð ð ×'Ñ'¨Ð6GÕHà+�ð ×'Ñ'¨°lÔCð —y‘y×3Ò3Ø×&Ñ& |Õ4ð 4øôQ ×$Ñ$×4Ñ4ò 	Ø‹Jð	ús   §!E: Å:FÆF)N)Ú__name__Ú
__module__Ú__qualname__r4   r/   r   r:   rX   Údictrv   rˆ   rŒ   r•   r™   rœ   r   r¡   r£   r©   r¬   r¹   rÃ   rË   © r0   r.   r   r   4   s  „ ð	
¨cð 	
°dó 	
ð°ð ¸ó ð°#ð ÀSó ð: QSñ ¸4ð Èð ÐW[ó ð@&°só &ð# Tð #¸ó #ð"2ÀTð 2ÐY\ó 2ðC°#ð CÀSó Cð.,°Cð ,¸Dó ,ñ°xÀ±}ð ÐPTó ò&
ð6¨ó 6ð L¨#ð L°$ó Lð&¨ó ð$
¨sð 
À#ó 
ó15r0   r   )5rl   r½   rN   r(   Úpathlibr   Útypingr   rs   rK   Ú
dbt.configr¥   Údbt_common.clients.systemr5   Údbt.adapters.factoryr   r   Údbt.config.profiler   Údbt.contracts.utilr   r³   Údbt.events.typesr	   r
   r   r   r   r   r   r   r   r   Ú	dbt.flagsr   Údbt.task.baser   r   Údbt.versionr   Údbt_common.events.functionsr   Údbt_common.exceptionsr   rÀ   rÁ   r+   ÚSTRINGru   ÚFLOATÚBOOLrx   r   rÐ   r0   r.   ú<module>rá      s™   ðÛ Û 	Û 	Û Ý Ý ã Û ã Û  ß ?Ý +Ý 8÷÷ ÷ õ  ß ?Ý 1Ý 2Ý 1à@€Ø+€	ð ˜}Ð-€ð �l‰lØ�9‰9Ø�[‰[Ø�J‰JØ
ñÐ ôf5ˆxõ f5r0   