From bbfb83cdba10b2639751a72d107961d2ea6ad63e Mon Sep 17 00:00:00 2001 From: kirbylife Date: Fri, 3 Nov 2023 01:40:58 -0600 Subject: [PATCH] Implement compatibility with values with commas --- dist/nvexpo-0.1.0-py3-none-any.whl | Bin 2672 -> 0 bytes dist/nvexpo-0.1.0.tar.gz | Bin 2140 -> 0 bytes nvexpo/__init__.py | 35 ++++++++++------ nvexpo/__pycache__/__init__.cpython-311.pyc | Bin 2331 -> 0 bytes nvexpo/__pycache__/nvexpo.cpython-311.pyc | Bin 6259 -> 0 bytes nvexpo/consts.py | 3 ++ nvexpo/nvexpo.py | 42 ++++++++++++++------ pyproject.toml | 4 +- 8 files changed, 57 insertions(+), 27 deletions(-) delete mode 100644 dist/nvexpo-0.1.0-py3-none-any.whl delete mode 100644 dist/nvexpo-0.1.0.tar.gz delete mode 100644 nvexpo/__pycache__/__init__.cpython-311.pyc delete mode 100644 nvexpo/__pycache__/nvexpo.cpython-311.pyc create mode 100644 nvexpo/consts.py diff --git a/dist/nvexpo-0.1.0-py3-none-any.whl b/dist/nvexpo-0.1.0-py3-none-any.whl deleted file mode 100644 index 6c19651b24cfe222baed2808cbe2410e31b4b557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2672 zcmZ`*2{e@J8y{DlAX+m8B3@sjD6oyRCYo|n6ispjAe*~ zEL~e&+mNj+_fEI}zfSJ)edjsvIo~r6k=8~ zJjo|&Rs1&KoXq`u&BjH1KGs{iH}34#zp*KS4v$t?g-2Blc4$ouhjZv;KIWOU;=wl{ zPiiSO;8KpC)&bq7&RvSZ@%DraB?({jcYM15p-L%ZBM1i?3au4_FWNWERWas=zVoS9 zVC3%`@L)8!>iKrjS#Kp==)}BV>8N;Tf1rG5bb#n3$I;UJ<0meJKJ*>l09MUOH>aCR z-hj9p1t1JLo}&aG`Fz>RfuC_0!V~&C-2Ki5_a-?as~ze4+j(v0@=XinKvHdj%%tll zB9u`69~oj$7faf`RHCkWb(t>h7MlpowJ3=lR z?UztL^rFa=Ze@TT2QfA6!r8P~m8JtfDI)NVH@Tj3s+Ox`pwnae`NJ7Zdd4=+Uspw> zG{%`1L)^vIHrGU;(Bb$>{fg;4A(z6`|4RLms#2{^OdM88|1HRmDEHOHum8Kw6#PN}zB8HFQUJPB|Sz z)P-QNL%z-Y7}Dyn4j-uf26mc3w>8_)M_3{3R#8KFCDX_N(zK!r7<|c__eAYaQSJclFW3$ zNqwdpjh0yracU+|uZs4U5TTUyf>lJc_Qlky(zay9^>xvLh57%QIF{Jj8I4JlseBP5jmQa36{T{-5#Gj zc?suj8a?F=4$6t+PiXV}OW8SLts~N@;pxPTGx>nTN+X-}1-K&c0k|m9rY0jjL*|5R z@cwR2<9YhtPKqgOC?~1FPjkwFfbu{P(AmQeBjD`$4Npl+86)JDCBjrcW99Z=rmoTg+Hab#cF`1ej8ryOLQXf@P^QM?KE83KE^3up^&N;TvxFW%&CDNuVy>{ps z>=wIo1tvCcV91BPt6J11Rv1qlEvIwcHX&j~&(H@woj>+_IXY+bABa%O5T}I1(dD?H zFup-ZAG8Mw;|Ih9Vq%T^`epk1_2SPN1G{A>eRFf{PFa+j~ztlKGEuEkCVe?R83)ouDL5>y146~fjjk7awtlllgsRpDw?GIKwoOz>GX~zea)U?dn%)vyhAARDfx(1PC|tba zMeF5^A(Q1q?I`6(+}*p2t!CpT%t%+qNk1+_lDe9$$eM8&*1_ECvF4mKoBLStx*0Yx zT2b*?ozF2?v2iOg!f~B3Nd1c$$Qj@IW(R`+Y#CnsSFf`Tk z9Xgl+6*ULV(PIi_pZ|Rd?tEYVJG30eAHF?*paFn_JEaua{)hj0mmWqRw)Zcz4&DFJ zN1FXG*rlI&m89A-M);lG&1j%GUC?}teL)6PFhskDwAS>BK4h8fUN@&W+# Ol=u5dSonR!1pEV8eo;~Y diff --git a/dist/nvexpo-0.1.0.tar.gz b/dist/nvexpo-0.1.0.tar.gz deleted file mode 100644 index eb6a95cbc001fd1bbe5af6a00ffb8c8c83c4c48a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcmV-i2&4BOiwFn+00002|890=cyMnmFfK7JFfMdqascgGZExE+63%D+3ZAYXY`|75 z`7JT(qPaG^S6tc#>0b5#pU+?{+SW!AwGx%s$mYM_3`xn7o%E7Jn-5z~fLJ8wjYD$y zjBMx7IedFg*MDc!XX(Lrp^l=*K0BRmZ~Kh>ZpU-I1F}AN0m?H$Q!sz<*5PhC{FC^_-r2><$M<)`6ivJ;gU{o$z+Yah=ZL#p%iWkEc%LfBW-4==B~y|M2Yg z`d-KDdP5h_zw5b!1JW_)|GSf8^1sRdMgBi_-Ju7Gpzj_HddDXJ|7iJNH4bO9AP&TA z<|Lb!$p4V{J(d3leQ(%z;rw@da1EIJ{{r;azZ_l#@nNzND;`@`5G6bnB-><`wMcnH z)RrK+U$rdD^4Wq!G>98b(tbmNSd1(JMAKzP#whN<nx;H`T=p@CQhGbPp((D3 za%?m$9F4gkGz=T|*hXj9WWiJT508aV^N9=PDqA2D(5sN4vAcWOg(|hSs^YH%l^(4;`qP2kN;hR|6c_E4{P|}8y*cDfM3T$1OI8H!t<;letz(pwMta!wrfH)+!qqiI&85?Zh=&r$3;l9HYs7O%2k?^fq(Us8~=1Y*PDkGf!1dw8jz(1{y=OW3)7A4;X zVpZ`3eQ++Cgk}WWTX2YIIt*flP`W;XBuB>bLqpR#c+}Vv$LoSfa~_Kzt{~MtEUxrE z2*kH@+DE-QbZS_~31g%}RD#ygPN4KU#!MCfWmz#<*mq#!etah_+}koH6+a;|CBG90 z7Qr%1tw*E$>qAk7mUEkeFkt)Gc7Edki))SmM%FV)QmA}qS9y5dph7@lBR4uuW7;C~ z$RFXx)N?^kkqLcN%%w@GrU7#U5w)f6$sO|C+r{2erK}Q}=V{8ot}g8M_MNK4(Zmx& zR#mu-8fw{_VGC#E!1*d-uvdRPvXoD9y5>lp_!Jglr?9E)o+`H<)D^#SZCkfjoGTaT zIeuZtbPc;zRW4u6>x3t0u0=lam_5biN`y<@D#|it6_b(WAd_XTR89WC=z_=6j&df- zmYCsemGR=WirY}`?n_AHuO6HYwjr#wysCp;rih3p4H#EEEgV+q5)&uv zqo$HlM;!)RGSQ5&`pyJYUTLw=@_kN*)<<%M|4_?aTWHATl7j@9?B4E0)eU~(#B8h1 zJudnydpGhcTSo5nJe~`PDMYZ*ysIU71{s6cuNnzwBHfTQkBirXuiiGd8t%)ds$Mm7 zu(!Q9w#QXpP8`k;0s~l}Ok|DX!qv0hOWw{rmEm{|x^B7T^DM@Xr~#!+wA0 znPc^%)&I#RN%?PVE*!z5@SC3huhjo;Z=iqwG3fONy)K-8Z`kRY`u`soXgzmL1nu`@zrG|YSq*t3TSTORse0&RAO7J+M zLFmkR^v0fADcm*6PWgi)fGSl_9G^jr?X!3uuxx6nZzoaUKV9bti}xC{@(B1e8Yw3* z!tXS8RWDPXCt%=a$4Htl7SaUHv};?@CfUfg>kJ&Xs>KmBy9Nm;3nD6CDo9z~bZiSS zpI~V@P()L|B7ttHyXY=7Bk$CL-3U0RU5R|M=^ja)tR1p=DOO|G>sSGLF50(&4;{U# z4hPLot&D|mlI6OboSi|~gJsN94Ev-&VD{<1PT~C7t+M02+v(JsJEPrtvsY=JpIvm0 z-75btUQHYryiQHzrxUp9Z3{vftg$+%cw3#2itN<-J?Db8GqI7Jw$F2rv5QcY{aHfi z3>WMw4?@2U7#nI@+;+d`L8@LP*lIJh=MWJvrWmj2{2DfdjJet?IP63;<1sX764=(C zI{%;l^iUiY*aX8TJ2&K+P~=#$t!mx+Bu-i#ryw_f)^{X2Z2 z8!Q3_iqBKNOlcHh);y!}GN(&MM$oVB19<8_m)|*hw#4zXCEU*QMO^Fs_G)dv<8XsO zPWxq(z(NSN7Kae@YoFi7a9h+H$dDmJ Sh71|1(0>6xs|BV2Pyhg3Kr*cW diff --git a/nvexpo/__init__.py b/nvexpo/__init__.py index 5720ac4..5531d17 100644 --- a/nvexpo/__init__.py +++ b/nvexpo/__init__.py @@ -1,23 +1,27 @@ #!/bin/python +import re import sys from nvexpo import nvexpo +from nvexpo import consts as CONSTS def main() -> int: args = sys.argv + print(args) if len(args) <= 1: - nvexpo.help() - return 0 - if len(args) == 2 and args[1] in ["--load"]: - nvexpo.load() + nvexpo.show_help() return 0 if args[1] in ["--unset"]: nvexpo.unset_env(args[2:]) return 0 + if args[1] in ["--load"]: + nvexpo._load() + return 0 + if args[1] in ["init"]: try: nvexpo.init(args[2]) @@ -26,22 +30,27 @@ def main() -> int: return 0 raw_vars = args[1:] - if not all("=" in x for x in raw_vars): - nvexpo.help() - return 1 - variables = {} for raw_var in raw_vars: + if "=" not in raw_var: + nvexpo.show_help("Use the syntax \"key=value\"") + return 1 try: key, value = raw_var.split("=", 1) - except ValueError: - nvexpo.help() + except ValueError as e: + nvexpo.show_help(f"Unexpected error {e}") return 1 key = key.strip("=") - value = value.strip("=").strip("\"") + value = value.strip("=").strip('"') variables[key] = value - if not key or not value: - nvexpo.help() + if not key: + nvexpo.show_help("Empty name") + return 1 + if not value: + nvexpo.show_help("Empty value") + return 1 + if not re.match(CONSTS.VARNAME_PATTERN, key): + nvexpo.show_help(f"\"{key}\" is not a valid name") return 1 nvexpo.set_env(variables) return 0 diff --git a/nvexpo/__pycache__/__init__.cpython-311.pyc b/nvexpo/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5cf4592acfe6f741fbe9be919d30bba0d7e5005f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcma)7TWcFf6rS0g)y2A4wXM`rQ7RnAsodCVNCPdn2E`5}4RKrI8e$rR?A@druUF3O zT9(2psKteK5mfY{79})(a$E8*()3*lf{F!$p)d7Q1*Ty9)HAC{ij=x!cIM3O%y+&s zb7uBupRW%=I{17>8XyS$$vUkBeLEfAfodCxNW=G&1_3>O7wRXi0kn&u2c?++2j8?y%yGbm=3>}#s2M4{mbM&J($}fF z{6g2R7%~s#@CT6FNPlVWUK=%!^fm*8j2@dJUa>W4PY_?&kmF@h^OT z+W=2OZAg)1P>+o^tN*gmvs!@Fr@I(BTF{`$i|8A!W9yY&1)9=&k`0vQZ=ns$c9OB`=AOs;U`vO{dk{8so;QOhLKKMS|8^# z+P)TZgX^}_yeqN3xdV2=DBH^eCSv%3V`4%{r$lHuCnnZaP150_6Iqq@<@U7&O?I^} zLODDQ;yP^KHU!LVR~|yfz!|iFw&Ce1y4j-<}Y`TfCOj zERv#kGZwE%DrH_<>d`eL)L0eN~-RfIN zDeF>mT+nnXuUSsmTDCCeuq|koi>5Y`nH1G5H%K|Pq)3|Od@*S8D^ku9G7Lsz?@QE9 z)NeCl-qTTNG7{R~a8L!b=kXUmD9r9T`^@*h%5COKiLW0P9`3pPMbDP6=reuw{(yPE zXSzIEzW?al&SE7Thuo{Y@AR07&5hE#6=wu8OxIk)<)Lz_yi{I#G+cF!)LbJK*NBbW zQhul63`1^kygR(-9VlKelk#VeoKk@j1Ho<2_nz`hH4v=@qJIR&o(INu^lIRIEpXlx>Y>x7yL4vDU+*8V zEtJpN)vGpa3;#Hf;MtrjeOM)t8i`a$r0(&W7c_SGPs8EMm(bHok(nU>+Yko%EEJl( z$UVClxe^q9AHpClS2D?>C7Fyl=m0Eg#xyUhx*b4lUQMk^$)rW3tgKTH(_z09JJgO{ zQ>$rlU6H0~493`tpxp-n=Yui0jy;7w_U)rkr8_qq=djOQZXl?7#XLsDYd(0+hbnxi hPP~Pg&8z0TIlr|~T&R+v8X2mza)U=C3|cm&e*s^d@7DkT diff --git a/nvexpo/__pycache__/nvexpo.cpython-311.pyc b/nvexpo/__pycache__/nvexpo.cpython-311.pyc deleted file mode 100644 index c5147bb9fccf53bd93c801ed0e14a337ef99d3c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6259 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 IO[Any]: return ENV_VARS.open(mode.value) -def _get_saved_vars() -> Dict[str, str]: + +def _get_saved_vars() -> dict[str, str]: output = {} with _get_file(Mode.R) as file: for line in file: @@ -30,31 +33,42 @@ def _get_saved_vars() -> Dict[str, str]: output[key] = value return output -def _save_vars(variables: Dict[str, str]): - new_variables = [f"{key}={value}" for key, value in variables.items()] + +def _save_vars(variables: dict[str, str]) -> None: + new_variables = [] + for key, value in variables.items(): + if "'" in value: + comma = '"' + elif '"' in value: + comma = "'" + else: + comma = "" + + new_variables.append(f"{key}={comma}{value}{comma}") with _get_file(Mode.W) as file: file.write("\n".join(new_variables)) -def _print_bulk(attrs: List[str], cmd: Cmd): +def _print_bulk(attrs: list[str], cmd: Cmd) -> None: for attr in attrs: print(f"{cmd.value} {attr}") -def _load(): + +def _load() -> None: current_vars = _get_saved_vars() attrs = [f"{key}={value}" for key, value in current_vars.items()] _print_bulk(attrs, Cmd.Set) -def set_env(variables: Dict[str, str]): +def set_env(variables: dict[str, str]) -> None: current_vars = _get_saved_vars() current_vars.update(variables) _save_vars(current_vars) _load() -def unset_env(variables: List[str]): +def unset_env(variables: list[str]) -> None: current_vars = _get_saved_vars() for var in variables: current_vars.pop(var, None) @@ -62,7 +76,7 @@ def unset_env(variables: List[str]): _print_bulk(variables, Cmd.Unset) -def help(error: None | str = None): +def show_help(error: None | str = None) -> None: msg = """ nx: Non-Volatile Export @@ -86,22 +100,24 @@ def help(error: None | str = None): hello world """.strip() msg = "\n".join(map(str.strip, msg.splitlines())) + if error is not None: + msg = f"Error: {error}\n\n" + msg print(msg, file=sys.stderr) -def init(shell: str | None = None): +def init(shell: str | None = None) -> None: if shell is None: shell = "bash" if shell == "bash": cmd = """ function nx(){ - eval "$(poetry run nvexpo $@)" + eval "$(nvexpo $@)" } """ print(cmd) _load() -if not os.path.exists(ENV_VARS): +if not ENV_VARS.exists(): _get_file(Mode.W).close() diff --git a/pyproject.toml b/pyproject.toml index 8e114ba..31d4756 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,9 @@ ignore = [ "PLR0911", "T201", "PLR2004", - "FA102" + "FA102", + "PLW2901", + "N812" ] fixable = ["ALL"]