""" Boolean geometry utilities. """ from __future__ import absolute_import #Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module. import __init__ import os import sys import traceback __author__ = 'Enrique Perez (perez_enrique@yahoo.com)' __credits__ = 'Art of Illusion ' __date__ = '$Date: 2008/02/05 $' __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' globalTemporarySettingsPath = os.path.join(os.path.expanduser('~'), '.skeinforge_pypy') def addToNamePathDictionary(directoryPath, namePathDictionary): 'Add to the name path dictionary.' pluginFileNames = getPluginFileNamesFromDirectoryPath(directoryPath) for pluginFileName in pluginFileNames: namePathDictionary[pluginFileName.replace('_', '')] = os.path.join(directoryPath, pluginFileName) def getAbsoluteFolderPath(filePath, folderName=''): 'Get the absolute folder path.' absoluteFolderPath = os.path.dirname(os.path.abspath(filePath)) if folderName == '': return absoluteFolderPath return os.path.join(absoluteFolderPath, folderName) def getAbsoluteFrozenFolderPath(filePath, folderName=''): 'Get the absolute frozen folder path.' if hasattr(sys, 'frozen'): if '.py' in filePath: filePath = ''.join(filePath.rpartition('\\')[: 2]) filePath = os.path.join(filePath, 'skeinforge_application') return getAbsoluteFolderPath(filePath, folderName) def getAnalyzePluginsDirectoryPath(subName=''): 'Get the analyze plugins directory path.' return getJoinedPath(getSkeinforgePluginsPath('analyze_plugins'), subName) def getCraftPluginsDirectoryPath(subName=''): 'Get the craft plugins directory path.' return getJoinedPath(getSkeinforgePluginsPath('craft_plugins'), subName) def getDocumentationPath(subName=''): 'Get the documentation file path.' return getJoinedPath(getFabmetheusPath('documentation'), subName) def getElementsPath(subName=''): 'Get the evaluate_elements directory path.' return getJoinedPath(getGeometryUtilitiesPath('evaluate_elements'), subName) def getEndsWithList(word, wordEndings): 'Determine if the word ends with a list.' for wordEnding in wordEndings: if word.endswith(wordEnding): return True return False def getFabmetheusPath(subName=''): 'Get the fabmetheus directory path.' fabmetheusFile = None if hasattr(sys, 'frozen'): fabmetheusFile = unicode(sys.executable, sys.getfilesystemencoding()) else: fabmetheusFile = os.path.dirname(os.path.abspath(__file__)) return getJoinedPath(os.path.dirname(fabmetheusFile), subName) def getFabmetheusToolsPath(subName=''): 'Get the fabmetheus tools directory path.' return getJoinedPath(getFabmetheusUtilitiesPath('fabmetheus_tools'), subName) def getFabmetheusUtilitiesPath(subName=''): 'Get the fabmetheus utilities directory path.' return getJoinedPath(getFabmetheusPath('fabmetheus_utilities'), subName) def getFileNamesByFilePaths(pluginFilePaths): 'Get the file names of the plugins by the file paths.' fileNames = [] for pluginFilePath in pluginFilePaths: pluginBasename = os.path.basename(pluginFilePath) pluginBasename = getUntilDot(pluginBasename) fileNames.append(pluginBasename) return fileNames def getFilePaths(fileInDirectory=''): 'Get the file paths in the directory of the file in directory.' directoryName = os.getcwd() if fileInDirectory != '': directoryName = os.path.dirname(fileInDirectory) return getFilePathsByDirectory(directoryName) def getFilePathsByDirectory(directoryName): 'Get the file paths in the directory of the file in directory.' absoluteDirectoryPath = os.path.abspath(directoryName) directory = os.listdir(directoryName) filePaths = [] for fileName in directory: filePaths.append(os.path.join(absoluteDirectoryPath, fileName)) return filePaths def getFilePathsRecursively(fileInDirectory=''): 'Get the file paths in the directory of the file in directory.' filePaths = getFilePaths(fileInDirectory) filePathsRecursively = filePaths[:] for filePath in filePaths: if os.path.isdir(filePath): directory = os.listdir(filePath) if len(directory) > 0: filePathsRecursively += getFilePathsRecursively(os.path.join(filePath, directory[0])) return filePathsRecursively def getFilePathWithUnderscoredBasename(fileName, suffix): 'Get the file path with all spaces in the basename replaced with underscores.' suffixFileName = getUntilDot(fileName) + suffix suffixDirectoryName = os.path.dirname(suffixFileName) suffixReplacedBaseName = os.path.basename(suffixFileName).replace(' ', '_') return os.path.join(suffixDirectoryName, suffixReplacedBaseName) def getFilesWithFileTypesWithoutWords(fileTypes, words = [], fileInDirectory=''): 'Get files which have a given file type, but with do not contain a word in a list.' filesWithFileTypes = [] for filePath in getFilePaths(fileInDirectory): for fileType in fileTypes: if isFileWithFileTypeWithoutWords(fileType, filePath, words): filesWithFileTypes.append(filePath) filesWithFileTypes.sort() return filesWithFileTypes def getFilesWithFileTypesWithoutWordsRecursively(fileTypes, words = [], fileInDirectory=''): 'Get files recursively which have a given file type, but with do not contain a word in a list.' filesWithFileTypesRecursively = [] for filePath in getFilePathsRecursively(fileInDirectory): for fileType in fileTypes: if isFileWithFileTypeWithoutWords(fileType, filePath, words): filesWithFileTypesRecursively.append(filePath) filesWithFileTypesRecursively.sort() return filesWithFileTypesRecursively def getFilesWithFileTypeWithoutWords(fileType, words = [], fileInDirectory=''): 'Get files which have a given file type, but with do not contain a word in a list.' filesWithFileType = [] for filePath in getFilePaths(fileInDirectory): if isFileWithFileTypeWithoutWords(fileType, filePath, words): filesWithFileType.append(filePath) filesWithFileType.sort() return filesWithFileType def getFileText(fileName, printWarning=True, readMode='r'): 'Get the entire text of a file.' try: file = open(fileName, readMode) fileText = file.read() file.close() return fileText except IOError: if printWarning: print('The file ' + fileName + ' does not exist.') return '' def getFileTextInFileDirectory(fileInDirectory, fileName, readMode='r'): 'Get the entire text of a file in the directory of the file in directory.' absoluteFilePathInFileDirectory = os.path.join(os.path.dirname(fileInDirectory), fileName) return getFileText(absoluteFilePathInFileDirectory, True, readMode) def getFundamentalsPath(subName=''): 'Get the evaluate_fundamentals directory path.' return getJoinedPath(getGeometryUtilitiesPath('evaluate_fundamentals'), subName) def getGeometryDictionary(folderName): 'Get to the geometry name path dictionary.' geometryDictionary={} geometryDirectory = getGeometryPath() addToNamePathDictionary(os.path.join(geometryDirectory, folderName), geometryDictionary) geometryPluginsDirectory = getFabmetheusUtilitiesPath('geometry_plugins') addToNamePathDictionary(os.path.join(geometryPluginsDirectory, folderName), geometryDictionary) return geometryDictionary def getGeometryPath(subName=''): 'Get the geometry directory path.' return getJoinedPath(getFabmetheusUtilitiesPath('geometry'), subName) def getGeometryToolsPath(subName=''): 'Get the geometry tools directory path.' return getJoinedPath(getGeometryPath('geometry_tools'), subName) def getGeometryUtilitiesPath(subName=''): 'Get the geometry_utilities directory path.' return getJoinedPath(getGeometryPath('geometry_utilities'), subName) def getInterpretPluginsPath(subName=''): 'Get the interpret plugins directory path.' return getJoinedPath(getFabmetheusToolsPath('interpret_plugins'), subName) def getJoinedPath(path, subName=''): 'Get the joined file path.' if subName == '': return path return os.path.join(path, subName) def getModuleWithDirectoryPath(directoryPath, fileName): 'Get the module from the fileName and folder name.' if fileName == '': print('The file name in getModule in archive was empty.') return None originalSystemPath = sys.path[:] try: sys.path.insert(0, directoryPath) folderPluginsModule = __import__(fileName) sys.path = originalSystemPath return folderPluginsModule except: sys.path = originalSystemPath print('') print('Exception traceback in getModuleWithDirectoryPath in archive:') traceback.print_exc(file=sys.stdout) print('') print('That error means; could not import a module with the fileName ' + fileName) print('and an absolute directory name of ' + directoryPath) print('') return None def getModuleWithPath(path): 'Get the module from the path.' return getModuleWithDirectoryPath(os.path.dirname(path), os.path.basename(path)) def getPluginFileNamesFromDirectoryPath(directoryPath): 'Get the file names of the python plugins in the directory path.' fileInDirectory = os.path.join(directoryPath, '__init__.py') return getFileNamesByFilePaths(getPythonFileNamesExceptInit(fileInDirectory)) def getProfilesPath(subName=''): 'Get the profiles directory path, which is the settings directory joined with profiles.' return getJoinedPath(getSettingsPath('profiles'), subName) def getPythonDirectoryNames(directoryName): 'Get the python directories.' pythonDirectoryNames = [] directory = os.listdir(directoryName) for fileName in directory: subdirectoryName = os.path.join(directoryName, fileName) if os.path.isdir(subdirectoryName): if os.path.isfile(os.path.join(subdirectoryName, '__init__.py')): pythonDirectoryNames.append(subdirectoryName) return pythonDirectoryNames def getPythonDirectoryNamesRecursively(directoryName=''): 'Get the python directories recursively.' recursivePythonDirectoryNames = [] if directoryName == '': directoryName = os.getcwd() if os.path.isfile(os.path.join(directoryName, '__init__.py')): recursivePythonDirectoryNames.append(directoryName) pythonDirectoryNames = getPythonDirectoryNames(directoryName) for pythonDirectoryName in pythonDirectoryNames: recursivePythonDirectoryNames += getPythonDirectoryNamesRecursively(pythonDirectoryName) else: return [] return recursivePythonDirectoryNames def getPythonFileNamesExceptInit(fileInDirectory=''): 'Get the python fileNames of the directory which the fileInDirectory is in, except for the __init__.py file.' pythonFileNamesExceptInit = getFilesWithFileTypeWithoutWords('py', ['__init__.py'], fileInDirectory) pythonFileNamesExceptInit.sort() return pythonFileNamesExceptInit def getPythonFileNamesExceptInitRecursively(directoryName=''): 'Get the python fileNames of the directory recursively, except for the __init__.py files.' pythonDirectoryNames = getPythonDirectoryNamesRecursively(directoryName) pythonFileNamesExceptInitRecursively = [] for pythonDirectoryName in pythonDirectoryNames: pythonFileNamesExceptInitRecursively += getPythonFileNamesExceptInit(os.path.join(pythonDirectoryName, '__init__.py')) pythonFileNamesExceptInitRecursively.sort() return pythonFileNamesExceptInitRecursively def getSettingsPath(subName=''): 'Get the settings directory path, which is the home directory joined with .skeinforge.' global globalTemporarySettingsPath return getJoinedPath(globalTemporarySettingsPath, subName) def getSkeinforgePath(subName=''): 'Get the skeinforge directory path.' return getJoinedPath(getFabmetheusPath('skeinforge_application'), subName) def getSkeinforgePluginsPath(subName=''): 'Get the skeinforge plugins directory path.' return getJoinedPath(getSkeinforgePath('skeinforge_plugins'), subName) def getSummarizedFileName(fileName): 'Get the fileName basename if the file is in the current working directory, otherwise return the original full name.' if os.getcwd() == os.path.dirname(fileName): return os.path.basename(fileName) return fileName def getTemplatesPath(subName=''): 'Get the templates directory path.' return getJoinedPath(getFabmetheusUtilitiesPath('templates'), subName) def getTextIfEmpty(fileName, text): 'Get the text from a file if it the text is empty.' if text != '': return text return getFileText(fileName) def getTextLines(text): 'Get the all the lines of text of a text.' if '\r' in text: text = text.replace('\r', '\n').replace('\n\n', '\n') textLines = text.split('\n') if len(textLines) == 1: if textLines[0] == '': return [] return textLines def getUntilDot(text): 'Get the text until the last dot, if any.' dotIndex = text.rfind('.') if dotIndex < 0: return text return text[: dotIndex] def getVersionFileName(): 'Get the file name of the version date.getFabmetheusUtilitiesPath(subName='')' return getFabmetheusUtilitiesPath('version.txt') def isFileWithFileTypeWithoutWords(fileType, fileName, words): 'Determine if file has a given file type, but with does not contain a word in a list.' fileName = os.path.basename(fileName) fileTypeDot = '.' + fileType if not fileName.endswith(fileTypeDot): return False for word in words: if fileName.find(word) >= 0: return False return True def makeDirectory(directoryPath): 'Make a directory if it does not already exist.' if os.path.isdir(directoryPath): return try: print('The following directory was made:') print(os.path.abspath(directoryPath)) os.makedirs(directoryPath) except OSError: print('Skeinforge can not make the directory %s so give it read/write permission for that directory and the containing directory.' % directoryPath) def removeBackupFilesByType(fileType): 'Remove backup files by type.' backupFilePaths = getFilesWithFileTypesWithoutWordsRecursively([fileType + '~']) for backupFilePath in backupFilePaths: os.remove(backupFilePath) def removeBackupFilesByTypes(fileTypes): 'Remove backup files by types.' for fileType in fileTypes: removeBackupFilesByType(fileType) def writeFileMessageEnd(end, fileName, fileText, message): 'Write to a fileName with a suffix and print a message.' suffixFileName = getUntilDot(fileName) + end writeFileText(suffixFileName, fileText) print(message + getSummarizedFileName(suffixFileName)) def writeFileText(fileName, fileText, writeMode='w+'): 'Write a text to a file.' try: file = open(fileName, writeMode) file.write(fileText) file.close() except IOError: print('The file ' + fileName + ' can not be written to.')