From 0da1e9b841d8351733083d11d13334e4154fa377 Mon Sep 17 00:00:00 2001 From: TiagoRG <35657250+TiagoRG@users.noreply.github.com> Date: Mon, 20 Feb 2023 22:21:57 +0000 Subject: [PATCH] Truthtable update: now installed into bin instead of an alias --- tools/truthtable/README.md | 16 ++++---- tools/truthtable/openInTerminal.png | Bin 48021 -> 0 bytes tools/truthtable/setup.sh | 18 ++++++++ tools/truthtable/truthtable.py | 61 ++++++---------------------- 4 files changed, 40 insertions(+), 55 deletions(-) create mode 100755 tools/truthtable/setup.sh diff --git a/tools/truthtable/README.md b/tools/truthtable/README.md index 8e5c06d..413ad61 100644 --- a/tools/truthtable/README.md +++ b/tools/truthtable/README.md @@ -1,15 +1,17 @@ # Truth Table Builder ### Script to build the truth table for a given function. + --- ## Installing -#### 1. Head over to [Release](https://github.com/TiagoRG/uaveiro-leci/releases/tag/ttb) and download the python file. -#### 2. Save it on any directory and then open the directory. +#### 1. Head over to [Release](https://github.com/TiagoRG/uaveiro-leci/releases/tag/ttb) and download the zip folder. +#### 2. Extract it into any location and then open that location. #### 3. Inside the directory, right click and choose "Open in terminal" ![- Unable to load image -](https://github.com/TiagoRG/uaveiro-leci/blob/master/tools/truthtable/openInTerminal.png) -#### 4. Run the following command: -`python3 truthtable.py bash` -#### 5. Relaunch the terminal and you will have the `truthtable` command +#### 4. Run the following commands: +1. Make sure the setup.sh is executable: `sudo chmod +x setup.sh`
+2. Install the script: `./setup.sh install` +#### 5. Done! You can now use the tool by running `truthtable` in terminal. + --- #### Use `truthtable usage` to know better how to use this tool. -#### If you want to change the location of the `truthtable.py` file, move it to another directory, open that directory in terminal and run -`python3 truthtable.py bash --reset` +#### If you want to remove the tool, run `./setup.sh uninstall`, delete setup.sh and it will be removed. diff --git a/tools/truthtable/openInTerminal.png b/tools/truthtable/openInTerminal.png index 9928b5f4b1f3ff0513fedb3974962ef4aaa3e1c6..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 48021 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

Uf zEv>ENLXt!(r)~d6o_73Gm0v9GU1I9$S}=1pH4fqm!D8{2Nc!8@Pv+sh^_H<;&g)xz zhF-}{z*&)BnmZXY!_Ag#Qp3Jm9_mYNMtJ%wT}e1WP$T7%FegziC4#0L+*bx>xRusl z`d`C#BIBv=T-GpoF%f$un%vS`J(f?p>!y{6J|HMUNl%M&vnvNp<%*`N?mxSGtTYe$ zWZxLJ{vvRmmKJP#FZ8F5h6tP?p~-?Qzv(YZ>Ed5dBTzuExP#y zBT(IT^BmiGz~Sx-{l@;`jm@;#FREj2l!=9qh^3<3phA>Dq81FVYbpt40fbR*Tm22$SiM>!>Jz!|AzkL6dlKyaXAMpo6W}b-^+0_7E;90Nd0ht;n$}CTHjB z1s9KJz>t(=3v#r?F~Z_14+~PC!kMmTqg`} zx$^PBQ;LU=icD38rVbQ?hAiZ(7t?}AoVQfLQWUq|4@oS8!g*HR+pc~I`>t_e<|(FZ zJy9Ax0Hj($8MLIbd=hw4Q6BqJg_}MSRZ1)q*3(}iT@SoRo3aE)$Vs5QKp{beL-1)o ziI#9ZD^ZJ(@&yAdDgfpwF3_wI(}Z;)PI!`}4T>9@V+Y7{qPc%dL`i&?T4!U!Rk@c) znEWrcun30%ev_zsw~bTW3&YbSkbG)c#q>8aMItP(-&ljCfj^xd_Kr9uWm2#0*FYTW ziB^dDvMT!0s*oucTI6&tiYT%{m6YQaA;17Ou8zemYOyJvnOF4FH+qifdTTPlH&%d+#A1eC<||NN&IBxv@U}B zCQ%c%pxvDHK-f@8kTUoyRkkO*-8rF~{73^%v=$ks`W3Z&AOXn^KYK(kFLgRoAkd4c z1v%tv(0dx4toQ}&0dovdEx9@9?=Ac++z>8gLLIyv87%eGzotDUfV*^`j0!%W47Ud; z1zc_pDYP|BnT@wJTvEcyp^NI2X2XUm)D88%>o+m9BJf3EEUk*{Uv7og<|SUfTp_|q z*H0tYC+}0~RN+rs6KBhb?|uT|&8Iu;mcq(DRLa_)5nn$zk1VPV!N$j4%E%In2$4)e z^i4~fdtO?*=$Y9#(bGeNwYaB4Wmz1i1@U59af*|6Nyrkuk^4$G$=z=T?qrVtQ3yGH zQJ#0g9hy|mKu+p9qiV%EOM-&Y_45<2h!nMXQL!L*MT3mP=~UrnFx$eah=C-_mKQlu zxU4=~f!X;*ws!L+H_-mT4*7rhXM{__$GA}hhT6=S{@K*Ee=>^MHp+Iw6AR z)l!pEBJ^qQFf!eQ>{MY`O5U zZu*Hk00?DHKD#Gtg5?TCm$5@BGZG@q0s$Beky+bq0?< z{oBUf+`6F$j=qZAg`;AS*03V4%Ey7pRKSmyf=U5-^Po_bwDWVnTs~y^HpxyLHnf?A ziawCFkMrr&u*4Lu&?J?}N>zvb<+jJ!{dwKr-N-c+F;>sd1*LKliTQCSaYwCQLQ0>! za5W$LW?4dtjPA&MhxaF-J~*VsrU`%fN?^;@ZRg~c_=L#a>rxE+-i?WSL<>0COBFxG ziA9Kc#(6T&BUc%g3ReRhFt~W^XQ}~N4F2CZ=OA7ie*wY$i;8&EO8nBx*QgoR|G%h+3mp~l!XQ%pL8if;m_v={N!-Iyz*F4Ira~;y z*<1JFu;eR1xtHS~Qx&A3kQyrWE1H*Jr /usr/bin/truthtable + sudo chmod o-w /usr/bin/truthtable + sudo chmod +x /usr/bin/truthtable + echo "Done. You can now delete this file or keep it to uninstall truthtable." + echo "You can now run truthtable by typing 'truthtable' in the terminal." +elif [ "$1" = "uninstall" ]; then + echo "Uninstalling truthtable..." + sudo rm /usr/bin/truthtable.py + sudo rm /usr/bin/truthtable + echo "Done." +else + echo "Usage: ./setup.sh [install|uninstall]" +fi \ No newline at end of file diff --git a/tools/truthtable/truthtable.py b/tools/truthtable/truthtable.py index 9fde1b4..f723e2e 100644 --- a/tools/truthtable/truthtable.py +++ b/tools/truthtable/truthtable.py @@ -14,61 +14,26 @@ truthtable '': > Variables: a-z > Operators: +, *, ~, (, ); You can't use ~ before () -truthtable bash: - Adds the command truthtable to bash, so you can use it from anywhere. - -truthtable bash --reset: - Resets the command truthtable in bash in case it's broken, so you can use it from anywhere. - truthtable usage: Prints this message.""") return - if sys.argv[1] == "bash": - username = os.getlogin() - if len(sys.argv) == 2: - with open(f'/home/{username}/.bashrc', 'r') as bashrc: - for line in bashrc: - if line.startswith('alias truthtable='): - print('Command already exists, try using, after opening a new terminal, truthtable \'\'') - return - os.system(f'echo "\n\nalias truthtable=\'python3 {pathlib.Path(__file__).parent.absolute()}/truthtable.py\'\n" >> \'/home/{username}/.bashrc\'') - print('Command added to bash, try using truthtable .\nIf it doesn\'t work, do truthtable bash --reset.') - elif sys.argv[2] == '--reset': - with open(f'/home/{username}/.bashrc', 'r') as bashrc: - lines = bashrc.readlines() - linesDict = {} - index = 1 - for line in lines: - linesDict[index] = line - index += 1 - for key in linesDict: - if linesDict[key].startswith('alias truthtable='): - del linesDict[key] - break - string = '' - for key in linesDict: - string += linesDict[key] - string += f'\n\nalias truthtable=\'python3 {pathlib.Path(__file__).parent.absolute()}/truthtable.py\'\n' - with open(f'/home/{username}/.bashrc', 'w') as bashrc: - bashrc.write(string) - print('Command readded to bash, try using, after opening a new terminal, truthtable .') - else: - function = sys.argv[1] - validVariables = r"[a-z]" - validOperators = ['+', '*', '(', ')', '~', ' ', '0', '1'] + function = sys.argv[1] - for char in function: - if not (re.match(validVariables, char) or char in validOperators): - print("Invalid function, use 'truthtable usage' to see the valid characters.") - return + validVariables = r"[a-z]" + validOperators = ['+', '*', '(', ')', '~', ' ', '0', '1'] - variables = re.findall(validVariables, function) - variables = list(dict.fromkeys(variables)) - variables.sort() + for char in function: + if not (re.match(validVariables, char) or char in validOperators): + print("Invalid function, use 'truthtable usage' to see the valid characters.") + return - truthTable = getTable(variables, function) - printTable(variables, truthTable) + variables = re.findall(validVariables, function) + variables = list(dict.fromkeys(variables)) + variables.sort() + + truthTable = getTable(variables, function) + printTable(variables, truthTable) def getTable(variables, function):