Imported paths module from Socializer. That means unicode paths should be fully supported
This commit is contained in:
parent
a65d6a82c0
commit
9ac26bc818
158
src/paths.py
158
src/paths.py
@ -1,116 +1,70 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
import inspect
|
import sys
|
||||||
import platform
|
import platform
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import glob
|
||||||
import sys
|
from platform_utils import paths as paths_
|
||||||
import string
|
|
||||||
import unicodedata
|
|
||||||
|
|
||||||
|
from functools import wraps
|
||||||
|
|
||||||
def app_data_path(app_name=None):
|
mode = "portable"
|
||||||
"""Cross-platform method for determining where to put application data."""
|
directory = None
|
||||||
"""Requires the name of the application"""
|
fsencoding = sys.getfilesystemencoding()
|
||||||
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)
|
|
||||||
|
|
||||||
def prepare_app_data_path(app_name):
|
if len(glob.glob("Uninstall.exe")) > 0: # installed copy
|
||||||
"""Creates the application's data directory, given its name."""
|
mode= "installed"
|
||||||
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
|
|
||||||
|
|
||||||
def app_path():
|
def app_path():
|
||||||
"""Return the root of the application's directory"""
|
return paths_.app_path()
|
||||||
path = executable_directory()
|
|
||||||
if is_frozen() and platform.system() == 'Darwin':
|
|
||||||
path = os.path.abspath(os.path.join(path, '..', '..'))
|
|
||||||
return path
|
|
||||||
|
|
||||||
def module_path(level=2):
|
def config_path():
|
||||||
return os.path.abspath(os.path.dirname(get_module(level)))
|
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():
|
def logs_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."""
|
global mode, directory
|
||||||
plat = platform.system()
|
if mode == "portable":
|
||||||
if plat == 'Windows':
|
if directory != None: path = os.path.join(directory, "logs")
|
||||||
import winpaths
|
elif directory == None: path = os.path.join(app_path(), "logs")
|
||||||
path = winpaths.get_my_documents()
|
elif mode == "installed":
|
||||||
elif plat == 'Darwin':
|
path = os.path.join(data_path(), "logs")
|
||||||
path = os.path.join(os.path.expanduser('~'), 'Documents')
|
if not os.path.exists(path):
|
||||||
else:
|
# log.debug("%s path does not exist, creating..." % (path,))
|
||||||
path = os.path.expanduser('~')
|
os.mkdir(path)
|
||||||
return path
|
return path
|
||||||
|
|
||||||
def safe_filename(filename):
|
def data_path(app_name='socializer'):
|
||||||
"""Given a filename, returns a safe version with no characters that would not work on different platforms."""
|
if platform.system() == "Windows":
|
||||||
SAFE_FILE_CHARS = "'-_.()[]{}!@#$%^&+=`~ "
|
data_path = os.path.join(os.getenv("AppData"), app_name)
|
||||||
filename = unicode(filename)
|
else:
|
||||||
new_filename = ''.join(c for c in filename if c in SAFE_FILE_CHARS or c.isalnum())
|
data_path = os.path.join(os.environ['HOME'], ".%s" % app_name)
|
||||||
#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.
|
if not os.path.exists(data_path):
|
||||||
return new_filename.strip(' .')
|
os.mkdir(data_path)
|
||||||
|
return data_path
|
||||||
|
|
||||||
def ensure_path(path):
|
def locale_path():
|
||||||
if not os.path.exists(path):
|
return os.path.join(app_path(), "locales")
|
||||||
os.makedirs(path)
|
|
||||||
return path
|
|
||||||
|
|
||||||
def start_file(path):
|
def sound_path():
|
||||||
if platform.system() == 'Windows':
|
return os.path.join(app_path(), "sounds")
|
||||||
os.startfile(path)
|
|
||||||
else:
|
|
||||||
subprocess.Popen(['open', path])
|
|
||||||
|
|
||||||
def get_applications_path():
|
def com_path():
|
||||||
"""Return the directory where applications are commonly installed on the system."""
|
global mode, directory
|
||||||
plat = platform.system()
|
if mode == "portable":
|
||||||
if plat == 'Windows':
|
if directory != None: path = os.path.join(directory, "com_cache")
|
||||||
import winpaths
|
elif directory == None: path = os.path.join(app_path(), "com_cache")
|
||||||
return winpaths.get_program_files()
|
elif mode == "installed":
|
||||||
elif plat == 'Darwin':
|
path = os.path.join(data_path(), "com_cache")
|
||||||
return '/Applications'
|
if not os.path.exists(path):
|
||||||
|
# log.debug("%s path does not exist, creating..." % (path,))
|
||||||
|
os.mkdir(path)
|
||||||
|
return path
|
||||||
|
Loading…
Reference in New Issue
Block a user