XBFjdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddlmZmZmZmZmZmZmZddlmZmZmZGdd eZGd d eZGd d eZGddeZGddZeZ Gddej!Z!dGdZ"GddeZ#dHdZ$Gd d!e%Z&Gd"d#Z'Gd$d%e(e'Z)Gd&d'e je je'Z*Gd(d)Z+Gd*d+e+Z,Gd,d-e,Z-Gd.d/e,Z.Gd0d1e+Z/ej0d2Z1d3Z2d4Z3Gd5d6ej4Z5Gd7d8e%Z6Gd9d:ej!Z7e je(e jfZ8Gd;dej4Z:Gd?d@e9Z;GdAdBe;Zrselfs r__repr__z_Sentinel.__repr__6s&&rcdS)Nz rr%s r__str__z_Sentinel.__str__9s~rNr"r#)rrrr'r)rrrr!r!5s<''''rr!cReZdZdZdd fd Zejjje_xZS) ArgumentParserz?Simple argparse subclass that prints help to stdout by default.Nfilet.Anyr"Nonecb| tj}t|SN)sysstdoutsuper print_help)r&r- __class__s rr5zArgumentParser.print_helpCs' <:Dww!!$'''rr1)r-r.r"r/)rrr__doc__r5argparser, __classcell__r6s@rr,r,@sSII((((((( "0;CJrr,fnamer#globdict[str, Any]r"r/ct|d5}tt||d||ddddS#1swxYwYdS)Nrbexec)openr@compileread)r;r<fs rexecfilerEPs eT  ;a WQVVXXuf - -tT:::;;;;;;;;;;;;;;;;;;s3AAAceZdZUdZdZeZded<eZded<eZ ded<dd Z dd Z ddZ ddZ ddZeZddZddZddZd dZd!dZdS)"LazyConfigValueaProxy object for exposing methods on configurable containers These methods allow appending/extending/updating to add to non-empty defaults instead of clobbering them. Exposes: - append, extend, insert on lists - update on dicts - update, add on sets Nz List[t.Any]_extend_prepend_insertsobjr.r"r/c:|j|dS)zAppend an item to a ListN)rHappendr&rKs rrMzLazyConfigValue.appendis C     rotherc:|j|dS)z Extend a listN)rHextendr&rOs rrQzLazyConfigValue.extendms E"""""rc||jdd<dS)z#like list.extend, but for the frontNr)rIrRs rprependzLazyConfigValue.prependqs! bqbrct|tr|j|j|j|_|j|j|j|j|j|_|jr&||j|j|_|S||S)a Merge with another earlier LazyConfigValue or an earlier container. This is useful when having global system-wide configuration files. Self is expected to have higher precedence. Parameters ---------- other : LazyConfigValue or container Returns ------- LazyConfigValue if ``other`` is also lazy, a reified container otherwise. ) isinstancerGrHrQrIrJ_updateupdate get_valuerRs r merge_intozLazyConfigValue.merge_intous e_ - - ) M  . . . =DL M  0 0 0 N ! !$- 0 0 0!NDM| - T\***$} K>>%(( (rindexintct|tstd|j||fdS)NzAn integer is required)rVr\ TypeErrorrJrM)r&r[rOs rinsertzLazyConfigValue.insertsC%%% 6455 5 eU^,,,,,rc|j0t|tri|_nt|_|j|dS)zUpdate either a set or dictN)rWrVdictsetrXrRs rrXzLazyConfigValue.updatesL < %&& %! "uu  E"""""rc2||hdS)zAdd an item to a setN)rXrNs raddzLazyConfigValue.adds SErinitialc|j|jStj|}t|trJ|jD]\}}||||j|dd<||j nmt|tr"|j r| |j n6t|tr!|j r| |j ||_|S)znconstruct the value from the initial one after applying any insert / extend / update changes Nr)_valuecopydeepcopyrVlistrJr_rIrQrHrarWrXrb)r&revalueidxrKs rrYzLazyConfigValue.get_values ; ";  g&& eT " " + M ' 'S S#&&&& E"1"I LL & & & & t $ $ +| + T\*** s # # +| + T\***  rdict[str, t.Any]ci}|jr |j|d<|jr |j|d<|jr |j|d<n|jr |j|d<|S)zreturn JSONable dict form of my data Currently update as dict or set, extend, prepend as lists, and inserts as list of tuples. rXrQrTinserts)rWrHrIrJ)r&ds rto_dictzLazyConfigValue.to_dictsd  < ',AhK < ',AhK = )=AiLL ] )=AiLrr#c|jd|jjd|jdSd|jjd|dS)N )rgr6rrqr%s rr'zLazyConfigValue.__repr__sP ; "Gt~.GGt{GGG GDt~.DDDDD Dr)rKr.r"r/rOr.r"r/)rOr.r"r.)r[r\rOr.r"r/)rer.r"r.r"rmr*)rrrr7rgr rH__annotations__rIrJrMrQrTrZr_rrWrXrdrYrqr'rrrrGrGUsJ  F 466G!!!! DFFH"""" DFFH""""!!!!####""""))))B----ceeG####. EEEEEErrGkeyboolct|o9|d|dko|d S)z>Is a Config key a section name (does it start with a capital)?r_)rzupper startswithrys r_is_section_keyrs> LA #a&0L9L9L5L M MMrceZdZdZddZddZdd Zdd Zd d Zd!fd Z e Z d"dZ d#dZ d#dZ d$dZd%dZd&dZd%dZd&dZd'dZxZS)(ConfigaAn attribute-based dict that can do smart merges. Accessing a field on a config object for the first time populates the key with either a nested Config object for keys starting with capitals or :class:`.LazyConfigValue` for lowercase keys, allowing quick assignments such as:: c = Config() c.Class.int_trait = 5 c.Class.list_trait.append("x") argsr.kwdsr"r/cXtj|g|Ri||dSr1)ra__init___ensure_subconfig)r&rrs rrzConfig.__init__s: d*T***T***      rc|D]a}||}t|rHt|tr3t|tst ||t|bdS)zensure that sub-dicts that should be Config objects are casts dicts that are under section keys to Config objects, which is necessary for constructing Config objects from dict literals. N)rrVrarsetattr)r&ryrKs rrzConfig._ensure_subconfigss  0 0Cs)Cs## 0 3(=(= 0jQTV\F]F] 0c6#;;/// 0 0rrOc0||dS)z$deprecated alias, use Config.merge()N)mergerRs r_mergez Config._merges 5rci}|D]\}}||vr|||<t|tr7t||tr|||[t|tr|||||<|||<||dS)z)merge another config object into this oneN)itemsrVrrrGrZrX)r&rO to_updatekvs rrz Config.merges KKMM % %DAq}} ! a((%ZQ-H-H%GMM!$$$$?33%ll4733DGG$%IaLL Irrmci}|D]d}||vr||}||}|D]J}||vrD||||kr2||i||d|||||<Ke|S)zCheck for collisions between two config objects. Returns a dict of the form {"Class": {"trait": "collision message"}}`, indicating which values have been ignored. An empty dict indicates no collisions. z ignored, using ) setdefault)r&rO collisionssectionminetheirsrys rrzConfig.collisionss(*  _ _Ge##=D7^F _ _&==T#Y&+%=%=))'266626s)/^/^vVY{/^/^Jw', _rryrzcd|vr)|dd\}}||vrdS|||vSt|S)N.F)splitr4 __contains__)r&ryfirst remainderr6s rrzConfig.__contains__'s[ #::"yya00 E9D  uU + +ww##C(((rr#c(t|o||vSr1)rr&rys r _has_sectionzConfig._has_section4ss##3t 3rcbt|t|Sr1)typerarhr%s rrhz Config.copy7s"tDzz$))D//***rc*|Sr1)rhr%s r__copy__zConfig.__copy__:syy{{rmemocPt|}|D]y\}}t|ttfrt j||}n=t|tttthvrt j|}|||<z|Sr1) rrrVrrGrhrirarjrbtuple)r&r new_configryrks r __deepcopy__zConfig.__deepcopy__=sT$ZZ\\ **,, $ $JC%&/!:;; ) eT22etS% 888 %((#JsOOrcX t||S#t$rt|r.t }t||||cYS|ds.t}t||||cYSwxYw)Nr|)ra __getitem__KeyErrorrr __setitem__r~rG)r&rycrs rrzConfig.__getitem__Is ##D#.. .   s## HH  sA...^^C(( #%%  sA... sAB)$AB)'B)rkct|r*t|tstd|d|t|||dS)NzIvalues whose keys begin with an uppercase char must be Config instances: , )rrVr ValueErrorrar)r&ryrks rrzConfig.__setitem__Ysz 3   eV,,  I69II?DII sE*****rc|drt||S ||S#t$r}t ||d}~wwxYwN__)r~ra __getattr__rrAttributeErrorr&ryes rrzConfig.__getattr__bst >>$   /##D#.. . +##C(( ( + + + ## * +sA A&A!!A&c|drt|||S |||dS#t$r}t ||d}~wwxYwr)r~ra __setattr__rrr)r&ryrkrs rrzConfig.__setattr__js~ >>$   6##D#u55 5 +   S% ( ( ( ( ( + + + ## * +sA A*A%%A*c|drt||S t||dS#t$r}t ||d}~wwxYwr)r~ra __delattr__ __delitem__rrrs rrzConfig.__delattr__rs| >>$   /##D#.. . +   T3 ' ' ' ' ' + + + ## * +sA A.A))A.)rr.rr.r"r/r"r/rv)rOrr"rmryr.r"rzryr#r"rzrw)rr.r"rryr#r"r.)ryr#rkr.r"r/ryr#r"r/)rrrr7rrrrrrhas_keyrrhrrrrrrrr9r:s@rrrsf  !!!! 0 0 0 0$())))))G4444++++     ++++++++++++++++++++rrc,eZdZdZd dZd fd ZxZS) DeferredConfigz0Class for deferred-evaluation of config from CLItraitTraitType[t.Any, t.Any]r"r.c td)NzImplement in subclassesNotImplementedError)r&rs rrYzDeferredConfig.get_value~s!";<<,>AAAArNrr*rrrr7rYr'rrrrrsL"    BBBBBBrrc"eZdZdZd dZd dZd S) DeferredConfigListaConfig value for loading config from a list of strings Interpretation is deferred until it is loaded into the trait. This class is only used for values that are not listed in the configurable classes. When config is loaded, `trait.from_string_list` will be used. If an error is raised in `.from_string_list`, the original string list is returned. .. versionadded:: 5.0 rrr"r.c <t|drt|}|j}nXt|dkr6t |jdt|dt||d}|j} ||S#t$r|cYSwxYw)rfrom_string_listrz only accepts one value, got z: r)hasattrrjrlenrnamerr)r&rsrccasts rrYzDeferredConfigList.get_values 5, - - %t**C)DD4yy1}} zYYD YYTRVZZYYq'C$D 499    JJJ  s B BBr#cJ|jjd|dSrrr%s rr'zDeferredConfigList.__repr__rrNrr*rrrrrrsL  ,BBBBBBrrc4eZdZdZd dZddd Zdd Zdd ZdS) ConfigLoadera1A object for loading configurations from just about anywhere. The resulting configuration is packaged as a :class:`Config`. Notes ----- A :class:`ConfigLoader` does one thing: load a config from a source (file, command line arguments) and returns the data as a :class:`Config` object. There are lots of things that :class:`ConfigLoader` does not do. It does not implement complex logic for finding config files. It does not handle default values or merge multiple configs. These things need to be handled elsewhere. r"rcRddlm}tjt|S)Nr) get_logger) traitlets.logrtrr)r&rs r _log_defaultzConfigLoader._log_defaults,,,,,,,vfjjll+++rNlog Logger | Noner/c||5||_|jddS||_dS)aeA base class for config loaders. log : instance of :class:`logging.Logger` to use. By default logger of :meth:`traitlets.config.application.Application.instance()` will be used Examples -------- >>> cl = ConfigLoader() >>> config = cl.load_config() >>> config {} NzUsing default logger)clearrrdebug)r&rs rrzConfigLoader.__init__sO ;((**DH HNN1 2 2 2 2 2DHHHrc,t|_dSr1)rconfigr%s rrzConfigLoader.clearshh rrc8||jS)aLoad a config from somewhere, return a :class:`Config` instance. Usually, this will cause self.config to be set and then returned. However, in most cases, :meth:`ConfigLoader.clear` should be called to erase any previous state. )rrr%s r load_configzConfigLoader.load_configs {r)r"rr1)rrr"r/rr"r)rrrr7rrrrrrrrrss  ,,,, *rrc.eZdZdZd dfd Zdd ZxZS)FileConfigLoaderzA base class for file based configurations. As we add more file based config loaders, the common logic should go here. Nfilenamer#path str | Nonekwr.r"r/c dtjdi|||_||_d|_dS)a.Build a config loader for a filename and path. Parameters ---------- filename : str The file name of the config file. path : str, list, tuple The path to search for the config file on, or a sequence of paths to try in order. Nr)r4rrr full_filename)r&rrrr6s rrzFileConfigLoader.__init__s> 2   rcDt|j|j|_dS)z,Try to find the file by searching the paths.N)rrrrr%s r _find_filezFileConfigLoader._find_file$s%dmTY??rr1)rr#rrrr.r"r/r)rrrr7rrr9r:s@rrr sh        @@@@@@@@rrc:eZdZdZddZddZddZdd ZddZdS)JSONFileConfigLoaderaA JSON file loader for config Can also act as a context manager that rewrite the configuration file to disk on exit. Example:: with JSONFileConfigLoader('myapp.json','/home/jupyter/configurations/') as c: c.MyNewConfigurable.new_value = 'Updated' r"rc| |n/#t$r"}tt ||d}~wwxYw|}|||_|jSz=Load the config from a file and return it as a Config object.N)rrOSErrorrr#_read_file_as_dict_convert_to_configr)r&rdcts rrz JSONFileConfigLoader.load_config5s  4 OO     4 4 4$SVV,,! 3 4%%''--c22 {+ AAArmct|j5}tjdt j|cdddS#1swxYwYdS)Nrm)rArrrjsonload)r&rDs rrz'JSONFileConfigLoader._read_file_as_dict@s $$ % % <6,dill;; < < < < < < < < < < < < < < < < < Load the config file into self.config, with recursive loading.r"rcjS)zKUnnecessary now, but a deprecation warning is more trouble than it's worth.rr%sr get_configz9PyFileConfigLoader._read_file_as_dict..get_configs ; r)rr&r*__file__r?r@Nr)rarr&rrAr@rBrC)r&r* namespace conf_filenamerDs` rrz%PyFileConfigLoader._read_file_as_dicts      k.!'    * - & & Q! =&999i P P P Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Qs3BBBrr1)r;r#rrr"r/r)rrrr7rr&rrrrr!r!`se  * * * * *QQQQQQrr!c&eZdZdZ d dd Zdd ZdS)CommandLineConfigLoaderzA config loader for command line arguments. As we add more command line based loaders, the common logic should go here. Nlhsr.rhsrTraitType[t.Any, t.Any] | Noner"r/c|}t|trs|r||}nt|trEt |dkr2t t j|d}n'|r| |}nt |}| d^}}|j }|D] }||} |||<dS)zexecute self.config. = * expands ~ with expanduser * interprets value with trait if available rrrN) rVrrYrrrosr expanduserrrr) r&r0r1rrkrryrparts r_exec_config_strz(CommandLineConfigLoader._exec_config_strs e^ , , 4 I..C!344 ISQ,RW-?-?A-G-GHH 4))%00,U33YYs^^ s+ $ $DdmGG rcfgct|ttfr<|D]%\}}|j||&dSt d|z)z=update self.config from a flag, which can be a dict or ConfigzInvalid flag: %rN)rVrarrrrXr^)r&r8secrs r _load_flagz"CommandLineConfigLoader._load_flagss cD&> * * 6))++ + +Q C ''**** + +.455 5rr1)r0r.r1r.rr2r"r/)r8r.r"r/)rrrr7r7r;rrrr/r/sROS:666666rr/z^\-?\-[A-Za-z][\w]*(\.[\w]+)*$__DOT____DASH__ceZdZdZ ddd ZdS) _KVActionzDCustom argparse action for handling --Class.trait=x Always Nparserargparse.ArgumentParserr,rmvaluest.Sequence[t.Any] option_stringrr"r/ct|tr|g}d|D}t||jd}|t }nt |}||t ||j|dS)Nc(g|]}|turdn|S-_DASH_REPLACEMENT).0rs r z&_KVAction.__call__..s'GGG1///##QGGGr)rVr#getattrdestrrQr)r&r@r,rBrDrs r__call__z_KVAction.__call__s fc " " XFGGGGG 49d33 =&((EE&u--E V 49e,,,,,rr1) r@rAr,rmrBrCrDrr"r/)rrrr7rOrrrr?r?s<%) -------rr?cBeZdZdZddZdfd Zdfd Zddd ZxZS)_DefaultOptionDictz_Like the default options dict but acts as if all --Class.trait options are predefined ryr#r"r/ct|g|ddt|d||<dS)NrHr)option_stringsrNmetavar)r?lstripreplace_DOT_REPLACEMENTrs r_add_kv_actionz!_DefaultOptionDict._add_kv_actionsN5C((.>??JJsOO    S rr.rzcd|vrdSt|rdS|dr1t|r||dSdS)N=FTrH)r4rr~class_trait_opt_patternmatchrXr&ryr6s rrz_DefaultOptionDict.__contains__sx #::5 77   $ $ 4 >>#   #:#@#@#E#E     $ $ $4urcl||vr!t|St|r1)r4rrr]s rrz_DefaultOptionDict.__getitem__s0 $;;77&&s++ +3-- rNdefaultc8 ||S#t$r|cYSwxYwr1)r)r&ryr_s rgetz_DefaultOptionDict.gets5 9    NNN s  rrrr1)ryr#r_r.r"r.) rrrr7rXrrrar9r:s@rrQrQs                 rrQc(eZdZdZ d d fd ZxZS) _KVArgParserzOsubclass of ArgumentParser where any --Class.trait option is implicitly definedNrt.Sequence[str] | Noner,argparse.Namespace | Noner"+tuple[argparse.Namespace | None, list[str]]c||jfD]}t|j|_t||Sr1) _optionalsrQ_option_string_actionsr4parse_known_args)r&rr, containerr6s rrjz_KVArgParser.parse_known_argssM 0 d dI/A)Bb/c/cI , ,ww''i888r)NN)rrdr,rer"rf)rrrr7rjr9r:s@rrcrc sOYY[_99999999999rrccxeZdZdZeZ ddfd Zddedfd dZd!dZ d"dZ d#dZ d$dZ d%dZ d"dZxZS)&ArgParseConfigLoaderzEA loader that uses the argparse module to load from the command line.Nargvlist[str] | Nonealiasesdict[str, str] | Noneflagsrr.classeslist[type[t.Any]] | None subcommandsSubcommandsDict | None parser_args parser_kwr"r/c|pg}tt||||tjdd}||_|pi|_|pi|_||_||_ ||_ | dd|_ ttj} | || |_dS)a>Create a config loader for use with argparse. Parameters ---------- classes : optional, list The classes to scan for *container* config-traits and decide for their "multiplicity" when adding them as *argparse* arguments. argv : optional, list If given, used to read command-line arguments from, otherwise sys.argv[1:] is used. *parser_args : tuple A tuple of positional arguments that will be passed to the constructor of :class:`argparse.ArgumentParser`. **parser_kw : dict A tuple of keyword arguments that will be passed to the constructor of :class:`argparse.ArgumentParser`. aliases : dict of str to str Dict of aliases to full traitlets names for CLI parsing flags : dict of str to str Dict of flags to full traitlets names for CLI parsing log Passed to `ConfigLoader` Returns ------- config : Config The resulting Config object. )rNrr)argument_default)r4r/rrr2rnrprrrsrurwrrrar8SUPPRESSrXrx) r&rnrprrrrsrurwrxkwargsr6s rrzArgParseConfigLoader.__init__"sN-R %t,,55#5>>> <8ABBself.parsed_datac,g|]}t|Sr)r rKas rrLz4ArgParseConfigLoader._parse_args..s///Qa///rr--rHargr#r"c|dkrtSD]I\}}||kr|cS||dzr"|dz|t|dzdzcSJ|S)NrHrZr)rJrr~r)rrrunpacked_aliasess r_replacez2ArgParseConfigLoader._parse_args.._replacesczz(((..00 7 71!88HHH>>!c'**7s7SQ!%666667JrNc&g|] }|Srr)rKrrs rrLz4ArgParseConfigLoader._parse_args..s!222AHHQKK222r)rr#r"r#) rprrrrVrrr[r@ parse_args parsed_datar) r&ruargsalias alias_targetalrlrto_parserrs @@rrz ArgParseConfigLoader._parse_argssm//$///+- < F! '+|'9'9';'; F F#|DJ&&!%//%"HEFFB2ww!||59L5H(r2262E$TBY//F        5==++d##CsQwyy)JTcT{HHJH2222222;11(;;$rct|jD]B\}}|d^}}|j}|D] }||} t |||CdS)zself.parsed_data->self.configrN)varsrrrrr)r&rrrryrps rr z'ArgParseConfigLoader._convert_to_configs)**0022 % %DAqJT3kG % %!!* GS! $ $ $ $  % %r)NNNNNN)rnrorprqrrrqrr.rsrtrurvrwr.rxr.r"r/) rnrorpr.rrr.rsr.r"r)r"rrrpr.rrr.rsr.r"r/rsrrurvr"r/)rr.r"r.)rrrr7r,rrrrrrrrrr r9r:s@rrmrmsOO!L"&)-'+,0.26 6 6 6 6 6 6 t"&" '''''R DDDDNNNNVVVV%%%%%%%%N%%%%%%%%rrmc0eZdZdZdfd Z dddZxZS) _FlagActionz ArgParse action to handle a flagrr.r|r"r/c|d|_|dd|_t|d<|jsd|d<t j|i|dS)Nflagrconstrnargs)rrrr r4rr&rr|r6s rrz_FlagAction.__init__siJJv&& ZZ.. #wz F7O$)&)))))rNr@r,rBrDrc|jdks |tur8t|dsg|_|j|jdSt ||j|dS)Nr_flags)rr rrrMrrr)r&r@r,rBrDs rrOz_FlagAction.__call__sl :??f 119h// &#%    # #DI . . . . . Itz6 2 2 2 2 2rrr.r|r.r"r/r1) r@r.r,r.rBr.rDrr"r/)rrrr7rrOr9r:s@rrrsc********[_333333333rrc6eZdZdZeZddZdd Zdd ZddZ dS)KVArgParseConfigLoaderznA config loader that loads aliases and flags with argparse, as well as arbitrary --Class.trait value rpr.rrrsr"r/c >i}|jj}|jg|ddix|_}|D]}|dD]i\}} |jd|} dti} t| ttfr,| j d d } | d kr| | d <n| | d <| | f|| <j|D]g\} \}}t| ts| f} | D]D}||vr ||||<t|d kr d|zd|zfnd|zf} || t||dEh|D]4\} }t| ts| f} | D]}t|dt"|d} d}||vri||\} }| |d | vr||vrt'd|d|d| j dpt)| dd}||vr0| d dt| d <||| d<|| d<t|d kr d|zd|zfnd|zf} || i| }|t-j|||_6dS)N)rr*)rTr)rr multiplicityrMactionrrrHr)rrhelp)rrNrTz The alias `z*` for the 'append' sequence config-trait `z` cannot be also a flag!' argcompleter?rrr)r@ add_argument set_defaultsargparse_traits class_traitsrrr#rVrrmetadatararrrrVrWrXrrMr functoolspartial completer)r&rprrrs alias_flagspaarcls traitnamerargname argparse_kwdsrkeysrkfhelpryrrrs rrz%KVArgParseConfigLoader._add_argumentss(* k&    +++ L$$$$243 B BC$'$4$4D$4$A$A$G$G$I$I B B 5 \77I77!' ei%677>#(>#5#5nh#O#OL#x//2> h//1= g.,1=+A(( B%*KKMM G G D.5%dE** w G G'>>05K -25c((a--c 4#:..dSj]T+EFFFFF  G '}}* * OD)dE** w& & %--c3CDD(!! $ //"1)"#5#5n#E#E$~tJJL ++",,Wc:::.9M(+,7 ,BM&)-6M'*25c((a--c 4#:..dSj]d4m44+'0'8$#(((F$I&  * * rc |j}t|jD]6\}}|dkrd|D|z|_!|dkr(|t d}d|vr||d}t|trt|}n$t|trt|}|j |}|r|d} ||||#t$rG}t|t r|}t%d|d|d ||d}~wwxYw|jjD]}||dS) zJself.parsed_data->self.config, parse unrecognized extra args via KVLoader.rc,g|]}|tkrdn|SrGrIrs rrLz=KVArgParseConfigLoader._convert_to_config..<s'"U"U"UA!/@*@*@33a"U"U"UrrrNrzError loading argument rZr)rrrrrVrW_handle_unrecognized_aliasrVrjrr#rrrar7rrrrrr;)r&rr0r1rrsubcs rr z)KVArgParseConfigLoader._convert_to_config6s_ T-..4466 W WHCl"""U"UQT"U"U"UXb"bh++.44C#~~//444#t$$ 0(--C%% 0*3//(,,S11E !a W%%c36666 W W Wc>22,//++C#$Nc$N$NC$N$N1$N$NOOUVV  W$+ " "D OOD ! ! ! ! " "s:D E#AEE#rr#c<|jd|dS)zHandling for unrecognized alias arguments Probably a mistyped alias. By default just log a warning, but users can override this to raise an error instead, e.g. self.parser.error("Unrecognized alias: '%s'" % arg) z1Unrecognized alias: '%s', it will have no effect.N)rwarning)r&rs rrz1KVArgParseConfigLoader._handle_unrecognized_alias]s# LcRRRRRrrrurvc  ddl}n#t$rYdSwxYwddlm}|}||_t |pg|_||jfit|didS)rrNr)argcomplete_config_argcomplete_kwargs) argcomplete ImportErrorrrExtendedCompletionFinderconfig_classesrjrur@rM)r&rsrurrfinders rrz#KVArgParseConfigLoader._argcompletefs          FF  )(((((#<<>> '!+"344t{GGgd,A2FFGGGGGs  Nrr)rr#r"r/r) rrrr7rcrrr rrrrrrrs  LOOOOb%"%"%"%"NSSSS H H H H H Hrrc$eZdZdZdfd ZxZS) KeyValueConfigLoaderz@Deprecated in traitlets 5.0 Use KVArgParseConfigLoader rr.r|r"r/crtjdtdtj|i|dS)Nz[KeyValueConfigLoader is deprecated since Traitlets 5.0. Use KVArgParseConfigLoader instead.r r~)rrrr4rrs rrzKeyValueConfigLoader.__init__|sK  3      $)&)))))rr)rrrr7rr9r:s@rrrvsG **********rr config_filesrrct}|D]W}t||} |}||>#t$rYJt $rwxYw|S)aLoad multiple Python config files, merging each of them in turn. Parameters ---------- config_files : list of str List of config files names to load and merge into the config. path : unicode The full path to the location of the config files. )r)rr!rrrr)rrrcfr$ next_configs rload_pyconfig_filesrsXXF & &#BT222 & ,,..K LL % % % % "    D      MsA A& A&)r;r#r<r=r"r/r)rrrr#r"r)>r7 __future__rr8rhrr r4rer2typingrloggingrtraitlets.traitletsrrrrr r r utilsr rrrrrrrr!rr,rErGrrarrr#rrrrrr!r/rBr[rWrJActionr?rQrcSubcommandsDictrmrrrrrrrrs$$#"""""  [[[[[[[[[[[[[[[[[[4444444444     )                        %   ikk DDDDDX,DDD ;;;; CECECECECEiCECECELNNNN X+X+X+X+X+TX+X+X+v66666666BBBBB3BBBB'B'B'B'B'B'B'B'B^44444444n@@@@@|@@@84!4!4!4!4!+4!4!4!n/Q/Q/Q/Q/Q)/Q/Q/Qd,6,6,6,6,6l,6,6,6j%"*%FGG--------2########L 9 9 9 9 98* 9 9 9&ae$g%g%g%g%g%2g%g%g%T33333(/333,VHVHVHVHVH1VHVHVHr * * * * *1 * * * r