diff --git a/src/paths.py b/src/paths.py index 37d6cb4..2954aeb 100644 --- a/src/paths.py +++ b/src/paths.py @@ -1,116 +1,70 @@ # -*- coding: utf-8 -*- - -import inspect +from __future__ import unicode_literals +import sys import platform import os -import subprocess -import sys -import string -import unicodedata +import glob +from platform_utils import paths as paths_ +from functools import wraps -def app_data_path(app_name=None): - """Cross-platform method for determining where to put application data.""" - """Requires the name of the application""" - plat = platform.system() - if plat == 'Windows': - import winpaths - path = winpaths.get_appdata() - elif plat == 'Darwin': - path = os.path.join(os.path.expanduser('~'), 'Library', 'Application Support') - elif plat == 'Linux': - path = os.path.expanduser('~') - app_name = '.%s' % app_name.replace(' ', '_') - return os.path.join(path, app_name) +mode = "portable" +directory = None +fsencoding = sys.getfilesystemencoding() -def prepare_app_data_path(app_name): - """Creates the application's data directory, given its name.""" - dir = app_data_path(app_name) - return ensure_path(dir) - -def embedded_data_path(): - if platform.system() == 'Darwin' and is_frozen(): - return os.path.abspath(os.path.join(executable_directory(), '..', 'Resources')) - return app_path() - -def is_frozen(): - """Return a bool indicating if application is compressed""" - import imp - return hasattr(sys, 'frozen') or imp.is_frozen("__main__") - -def get_executable(): - """Returns the full executable path/name if frozen, or the full path/name of the main module if not.""" - if is_frozen(): - if platform.system() != 'Darwin': - return sys.executable -#On darwin, sys.executable points to python. We want the full path to the exe we ran. - exedir = os.path.abspath(os.path.dirname(sys.executable)) - items = os.listdir(exedir) - items.remove('python') - return os.path.join(exedir, items[0]) - #Not frozen - try: - import __main__ - return os.path.abspath(__main__.__file__) - except AttributeError: - return sys.argv[0] - -def get_module(level=2): - """Hacky method for deriving the caller of this function's module.""" - return inspect.getmodule(inspect.stack()[level][0]).__file__ - -def executable_directory(): - """Always determine the directory of the executable, even when run with py2exe or otherwise frozen""" - executable = get_executable() - path = os.path.abspath(os.path.dirname(executable)) - return path +if len(glob.glob("Uninstall.exe")) > 0: # installed copy + mode= "installed" def app_path(): - """Return the root of the application's directory""" - path = executable_directory() - if is_frozen() and platform.system() == 'Darwin': - path = os.path.abspath(os.path.join(path, '..', '..')) - return path + return paths_.app_path() -def module_path(level=2): - return os.path.abspath(os.path.dirname(get_module(level))) +def config_path(): + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "config") + elif directory == None: path = os.path.join(app_path(), "config") + elif mode == "installed": + path = os.path.join(data_path(), "config") + if not os.path.exists(path): +# log.debug("%s path does not exist, creating..." % (path,)) + os.mkdir(path) + return path -def documents_path(): - """On windows, returns the path to My Documents. On OSX, returns the user's Documents folder. For anything else, returns the user's home directory.""" - plat = platform.system() - if plat == 'Windows': - import winpaths - path = winpaths.get_my_documents() - elif plat == 'Darwin': - path = os.path.join(os.path.expanduser('~'), 'Documents') - else: - path = os.path.expanduser('~') - return path +def logs_path(): + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "logs") + elif directory == None: path = os.path.join(app_path(), "logs") + elif mode == "installed": + path = os.path.join(data_path(), "logs") + if not os.path.exists(path): +# log.debug("%s path does not exist, creating..." % (path,)) + os.mkdir(path) + return path -def safe_filename(filename): - """Given a filename, returns a safe version with no characters that would not work on different platforms.""" - SAFE_FILE_CHARS = "'-_.()[]{}!@#$%^&+=`~ " - filename = unicode(filename) - new_filename = ''.join(c for c in filename if c in SAFE_FILE_CHARS or c.isalnum()) - #Windows doesn't like directory names ending in space, macs consider filenames beginning with a dot as hidden, and windows removes dots at the ends of filenames. - return new_filename.strip(' .') +def data_path(app_name='socializer'): + if platform.system() == "Windows": + data_path = os.path.join(os.getenv("AppData"), app_name) + else: + data_path = os.path.join(os.environ['HOME'], ".%s" % app_name) + if not os.path.exists(data_path): + os.mkdir(data_path) + return data_path -def ensure_path(path): - if not os.path.exists(path): - os.makedirs(path) - return path +def locale_path(): + return os.path.join(app_path(), "locales") -def start_file(path): - if platform.system() == 'Windows': - os.startfile(path) - else: - subprocess.Popen(['open', path]) +def sound_path(): + return os.path.join(app_path(), "sounds") -def get_applications_path(): - """Return the directory where applications are commonly installed on the system.""" - plat = platform.system() - if plat == 'Windows': - import winpaths - return winpaths.get_program_files() - elif plat == 'Darwin': - return '/Applications' +def com_path(): + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "com_cache") + elif directory == None: path = os.path.join(app_path(), "com_cache") + elif mode == "installed": + path = os.path.join(data_path(), "com_cache") + if not os.path.exists(path): +# log.debug("%s path does not exist, creating..." % (path,)) + os.mkdir(path) + return path