diff --git a/Code/DataStructureManipulations.py b/Code/DataStructureManipulations.py new file mode 100644 index 0000000..da30347 --- /dev/null +++ b/Code/DataStructureManipulations.py @@ -0,0 +1,120 @@ +from sys import platform as OperatingSystem + +Quotes = '"\'' + +if OperatingSystem == "win32": + PathSlash = '\\' +else: + PathSlash = '/' +FileProtocol = "file:" + 2*PathSlash + + +def ConvertToStandardPathFormat(Path): + """ Example, + Input: '"file:///some/path/somefile.extension" + Output: /some/path/somefile.extension + """ + Path = Path.strip(Quotes) + if Path.startswith(FileProtocol): + Path = Path[len(FileProtocol):] + return Path + + +def GetTextAfter(Text, ReadlinesTextFile): + for Lines in range(len(ReadlinesTextFile)): + Line = ReadlinesTextFile[Lines].strip('\n') + if Line.startswith(Text): + return Line[len(Text):] + return '' + + +def SingleQuoteString(String): + if len(String) > 0: + if String[0] != '\'' or String[-1] != '\'': + String = '\'' + String + '\'' + return String + + +def DoubleQuoteString(String): + if len(String) > 0: + if String[0] != '"' or String[-1] != '"': + String = '"' + String + '"' + return String + + +def ListIntoString(List, QuoteItems=0, Seprator=' '): + if QuoteItems == 2: + for i in range(len(List)): + Quoteditem = DoubleQuoteString(List[i]) + List[i] = Quoteditem + elif QuoteItems == 1: + for i in range(len(List)): + Quoteditem = SingleQuoteString(List[i]) + List[i] = Quoteditem + Stringoflist = (Seprator).join(List) + return Stringoflist + + +# strip=0 => remove both ' & ", 1 => remove ', 2 => remove " +def UnquoteString(String, strip=0): + while True: + if ( + strip != 2 and + String.startswith('"') and + String.endswith('"') + ): + String = String.strip('"') + elif ( + strip != 1 + and String.startswith("'") + and String.endswith("'") + ): + String = String.strip("'") + else: + break + return String + + +def StandardVariableName(Variable): + Variable = Variable.casefold() + Variable = Variable.replace('_', '').replace(' ', '') + return Variable + +""" +def DictionaryToJsonStr(Dict, BaseIndentation=0): + BI = '\t'*BaseIndentation + JsonStr = BI+'{\n' + for k, v in Dict.items(): + JsonStr += BI+'\t"'+k+'" : "'+v+'",\n' + JsonStr = JsonStr[:-2] + JsonStr += '\n'+BI+'}' + return JsonStr +""" + +def StringToKeyValuePair(String, Seprator): + SepratorAt = String.find(Seprator) + if SepratorAt >= 0: + Key = String[:SepratorAt] + Value = String[SepratorAt+1:] + return Key, Value + else: + return "", String + + +def FormatStrForDictinary(String): + String = String.strip(" \n\r") + return UnquoteString(String) + + +def StrListToDictionary( + List, + Seprator='=', + FormatFunction=FormatStrForDictinary + ): + Dictionary = {} + for i in List: + k, v = StringToKeyValuePair(i, Seprator) + k, v = FormatFunction(k), FormatFunction(v) + if len(k) > 0: + Dictionary[k] = v + return Dictionary diff --git a/Code/InputOutput.py b/Code/InputOutput.py new file mode 100644 index 0000000..e594ae6 --- /dev/null +++ b/Code/InputOutput.py @@ -0,0 +1,33 @@ +from os.path import isfile as DoesFileExist + +from .DataStructureManipulations import ConvertToStandardPathFormat + + +def ReadTextFile(FilePath): + FilePath = ConvertToStandardPathFormat(FilePath) + if DoesFileExist(FilePath) is True: + File = open(FilePath) + ReadFile = File.read() + File.close() + return ReadFile + else: + return '' + + +def ReadlinesTextFile(FilePath): + String = ReadTextFile(FilePath) + return String.split('\n') + + +def WriteTextFiles(FilePath, Text): + if type(Text) != str: + Text = '\n'.join(Text) + File = open(FilePath, 'w') + File.write(Text) + File.close() + + +def WriteBinaryToFile(Filepath, Data): + File = open(Filepath, 'wb') + File.write(Data) + File.close() diff --git a/Code/Network.py b/Code/Network.py new file mode 100644 index 0000000..2f469f2 --- /dev/null +++ b/Code/Network.py @@ -0,0 +1,8 @@ +import ssl +from urllib.request import urlopen + +HttpsContext = ssl.create_default_context() + + +def Download(Url): + return urlopen(Url, context=HttpsContext).read() diff --git a/Code/OS.py b/Code/OS.py new file mode 100644 index 0000000..bc89237 --- /dev/null +++ b/Code/OS.py @@ -0,0 +1,36 @@ +import os + + +def CallFuncInDir(Directory, Function, *args, **kwArgs): + CurrentDir = os.getcwd() + os.chdir(Directory) + Function(*args, **kwArgs) + os.chdir(CurrentDir) + + +def CreateDir(Directory): + """ return True if operation succesful and False if failed """ + if not os.path.isfile(Directory): + if not os.path.isdir(Directory): + os.mkdir(Directory) + return True + else: + return False + + +def CopyFile(Source, Destination): + """ raises exception if fails. + Implement exception handling else program will abort. + """ + try: + # hard link if on same partition + os.link(Source, Destination) + except FileExistsError: + # FIXME: create a function to compare if two files + # are same and use it here + pass + except OSError: + # copy if on different partition + shutil.copy2(Source, Destination) + except Exception as unknownError: + raise unknownError diff --git a/Code/__init__.py b/Code/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index ac42a23..75f74b2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# portablecode +# Python Portable Code -Python portable code library which can be used in any program without modification. \ No newline at end of file +Python portable code library which can be used in any program without modification. Many are simplified, self-explanatory interface for python standard library features.