~osomon/phatch/extract-all-metadata

« back to all changes in this revision

Viewing changes to phatch/lib/context.py

  • Committer: spe.stani.be at gmail
  • Date: 2010-03-11 16:02:11 UTC
  • mto: This revision was merged to the branch mainline in revision 1795.
  • Revision ID: spe.stani.be@gmail.com-20100311160211-4i54s0voyymzoi4s
implementing the context modules

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program.  If not, see http://www.gnu.org/licenses/
15
15
 
 
16
__all__ = ['get_context', 'join']
 
17
 
 
18
 
 
19
import os
16
20
import sys
17
 
import os
18
 
 
19
 
WINDOWS = sys.platform.startswith('win')
20
 
MAC = sys.platform.startswith('darwin')
21
 
LINUX = sys.platform.startswith('linux')
22
 
 
23
 
FROZEN = hasattr(sys, 'frozen')
24
 
FROZEN_MAC = MAC and FROZEN
25
 
FROZEN_WINDOWS = WINDOWS and FROZEN
26
 
 
27
 
INSTALLED_UNIX = (LINUX or MAC) and ('--unix' in sys.argv)
28
 
INSTALLED_WINDOWS = WINDOWS and ('--windows' in sys.argv)  # not supported yet
29
 
SOURCE = not(FROZEN_MAC or FROZEN_WINDOWS or INSTALLED_UNIX
30
 
    or INSTALLED_WINDOWS)
31
 
 
32
 
APP_NAME = '?'
33
 
 
34
 
 
35
 
def _find(root, subfolder):
36
 
    # look for parent folder
37
 
    folder = os.path.join(root, '..', subfolder)
38
 
    if os.path.isdir(folder):
39
 
        return folder
40
 
    # look in current folder
41
 
    return os.path.join(root, 'data')
42
 
 
43
 
 
44
 
def _get_source_root():
45
 
    return os.path.dirname(sys.argv[0])
46
 
 
47
 
 
48
 
def init(app_name):
49
 
    """This needs to be called first. It will initialize and verify
50
 
    DATA_PATH. It will raise an exception when necessary. The DATA_PATH
51
 
    is for images, docs, ... but not for locale.
52
 
 
53
 
    #>>> init('openoffice')
54
 
    #>>> APP_NAME
55
 
    #'openoffice'
 
21
 
 
22
import desktop
 
23
 
 
24
 
 
25
def endswith(x, suffices):
 
26
    for suffix in suffices:
 
27
        if x.endswith(suffix):
 
28
            return True
 
29
    return False
 
30
 
 
31
 
 
32
_CONTEXT = {}
 
33
 
 
34
# PLATFORM
 
35
if sys.platform.startswith('win'):
 
36
    _CONTEXT['platform'] = 'windows'
 
37
elif sys.platform.startswith('darwin'):
 
38
    _CONTEXT['platform'] = 'apple'
 
39
else:
 
40
    #assume linux
 
41
    _CONTEXT['platform'] = 'linux'
 
42
 
 
43
UNIX = _CONTEXT['platform'] in ('linux', 'apple')
 
44
 
 
45
# SETUP
 
46
if hasattr(sys, 'frozen'):
 
47
    _CONTEXT['distribute'] = 'frozen'
 
48
elif not endswith(sys.argv[0], ('.py', 'nosetests')):
 
49
    _CONTEXT['distribute'] = 'package'
 
50
else:
 
51
    _CONTEXT['distribute'] = 'source'
 
52
 
 
53
_CONTEXT['context'] = (_CONTEXT['platform'], _CONTEXT['distribute'])
 
54
 
 
55
 
 
56
class ContextError(Exception):
 
57
    pass
 
58
 
 
59
 
 
60
def join(*args):
 
61
    path = os.path.abspath(os.path.join(*args))
 
62
    if not os.path.exists(path):
 
63
        raise ContextError(path)
 
64
    return path
 
65
 
 
66
 
 
67
def join_create(*args):
 
68
    path = os.path.abspath(os.path.join(*args))
 
69
    if not os.path.exists(path):
 
70
        os.mkdir(path)
 
71
    return path
 
72
 
 
73
 
 
74
def _find_parent(path, base):
 
75
    if base == os.path.basename(path):
 
76
        return path
 
77
    if not path:
 
78
        raise ContextError('Can not find "%s" parent path.' % base)
 
79
    return _find_parent(os.path.abspath(os.path.join(path, '..')), base)
 
80
 
 
81
 
 
82
def _find_source_path(base_source):
 
83
    # __file__ may only be used to locate the source files
 
84
    return _find_parent(
 
85
        os.path.abspath(
 
86
            os.path.dirname(unicode(__file__, sys.getfilesystemencoding())),
 
87
        ),
 
88
        base_source,
 
89
    )
 
90
 
 
91
 
 
92
def get_context(app_name, base_source='source', sys_prefix=None):
 
93
    """Finds the right paths depending on the context, which consists of the
 
94
    platform and how it is distributed.
 
95
 
 
96
    context = (platform, distribute)
 
97
    platform = 'linux', 'apple' or 'windows'
 
98
    distribute = 'frozen', 'package' or 'source'
56
99
    """
57
 
    global APP_NAME
58
 
    global DATA_PATH
59
 
    global ROOT
 
100
    if sys_prefix is None:
 
101
        sys_prefix = sys.prefix
 
102
    context = _CONTEXT.copy()
60
103
    # initialize APP_NAME
61
 
    APP_NAME = app_name
 
104
    context['app_name'] = app_name
62
105
    # initialize APP_ROOT and DATA_PATH
63
 
    if SOURCE:
64
 
        # eg. phatch/data or phatch/phatch/data
65
 
        APP_ROOT = _get_source_root()
66
 
        DATA_PATH = os.path.join(APP_ROOT, '..', 'data')
67
 
        if not os.path.isdir(DATA_PATH):
68
 
            DATA_PATH = os.path.join(root, 'data')
69
 
    elif INSTALLED_UNIX:
70
 
        # eg. /usr/share/phatch
71
 
        APP_ROOT = _get_source_root()
72
 
        DATA_PATH = os.path.join(sys.prefix, 'share', APP_NAME)
73
 
    elif FROZEN_MAC:
74
 
        # eg. Phatch.app/Contents/Resources/
75
 
        APP_ROOT = os.path.dirname(os.path.dirname(unicode(sys.executable,
76
 
            sys.getfilesystemencoding())))
77
 
        DATA_PATH = os.path.join(APP_ROOT, 'Contents', 'Resources')
78
 
    elif FROZEN_WINDOWS:
79
 
        # The same as the exe dir
80
 
        APP_ROOT = os.path.dirname(unicode(sys.executable,
81
 
            sys.getfilesystemencoding()))
82
 
        DATA_PATH = os.path.join(APP_ROOT, 'data')
83
 
    else:
84
 
        raise Exception('Sorry your platform is not yet supported.')
85
 
    # make sure it is an absolute path
86
 
    DATA_PATH = os.path.abspath(DATA_PATH)
87
 
    # verify if it exists
88
 
    if not os.path.exists(DATA_PATH):
89
 
        raise Exception('Sorry, the expected data path does not exist.')
90
 
    # verify if it is a folder
91
 
    if not os.path.isdir(DATA_PATH):
92
 
        raise Exception('Sorry, the expected data path is not a folder.')
93
 
 
94
 
 
95
 
# Do we need this?
96
 
 
97
 
 
98
 
def get_actions_path_default():
99
 
    root = os.path.abspath(os.dirname(unicode(__file__,
100
 
        sys.getfilesystemencoding())))
101
 
    return os.path.join(root, 'actions')
102
 
 
103
 
 
104
 
def get_actions_path_frozen_mac():
105
 
    return os.path.join(get_data_path_frozen_mac(), 'actions')
106
 
 
107
 
 
108
 
def get_actions_path_frozen_windows():
109
 
    return os.path.join(get_data_path_frozen_windows, 'actions')
 
106
    if context['distribute'] == 'source':
 
107
        # source: eg. trunk/source
 
108
        context['app_source_path'] = _find_source_path(base_source)
 
109
        # data: eg. trunk/data
 
110
        context['app_data_path'] = join(
 
111
            context['app_source_path'], '..', 'data')
 
112
        # doc: eg. trunk/doc
 
113
        context['app_doc_path'] = join(
 
114
            context['app_source_path'], '..', 'doc')
 
115
        # locale: eg. trunk/locale
 
116
        context['app_locale_path'] = join(
 
117
            context['app_source_path'], '..', 'locale')
 
118
    elif context['context'] == ('linux', 'package'):
 
119
        # source: eg. /usr/share/phatch/source
 
120
        context['app_source_path'] = _find_source_path(base_source)
 
121
        # data: eg. /usr/share/phatch/data
 
122
        context['app_data_path'] = join(sys_prefix, 'share', app_name, 'data')
 
123
        # doc: eg. /usr/share/doc/phatch/
 
124
        context['app_doc_path'] = join(sys_prefix, 'share', 'doc', app_name)
 
125
        # locale: eg. /usr/share/locale/
 
126
        context['app_locale_path'] = join(sys_prefix, 'share', 'locale')
 
127
    #elif context['context'] == ('apple', 'frozen'):
 
128
    #    # TODO: implement this!
 
129
    #    APP_ROOT = os.path.dirname(os.path.dirname(unicode(sys.executable,
 
130
    #        sys.getfilesystemencoding())))
 
131
    #    # eg. Phatch.app/Contents/Resources/
 
132
    #    context['app_data_path'] = join(APP_ROOT, 'Contents', 'Resources')
 
133
    #elif context['context'] == ('windows', 'frozen'):
 
134
    #    # The same as the exe dir
 
135
    #    APP_ROOT = os.path.dirname(unicode(sys.executable,
 
136
    #        sys.getfilesystemencoding()))
 
137
    #    context['app_data_path'] = os.path.join(APP_ROOT, 'data')
 
138
    else:
 
139
        raise ContextError(
 
140
            'Sorry your context%(context)s is not yet supported.' % context)
 
141
 
 
142
    # other data pats
 
143
    context['app_images_path'] = join(context['app_data_path'], 'images')
 
144
 
 
145
    # user paths
 
146
    context['desktop_path'] = desktop.DESKTOP_PATH
 
147
    context['user_path'] = desktop.USER_PATH
 
148
    if context['platform'] == 'linux':
 
149
        context['user_cache_path'] = join_create(desktop.USER_CACHE_PATH,
 
150
            app_name)
 
151
        context['user_config_path'] = join_create(desktop.USER_CONFIG_PATH,
 
152
            app_name)
 
153
        context['user_data_path'] = join_create(desktop.USER_DATA_PATH,
 
154
            app_name)
 
155
    else:
 
156
        dot = '.' + app_name
 
157
        context['user_cache_path'] = join_create(desktop.USER_PATH, dot,
 
158
            'cache')
 
159
        context['user_config_path'] = join_create(desktop.USER_PATH, dot,
 
160
            'config')
 
161
        context['user_data_path'] = join_create(desktop.USER_PATH, dot,
 
162
            'data')
 
163
    return context
 
164
 
 
165
 
 
166
if __name__ == '__main__':
 
167
    import pprint
 
168
    pprint.pprint(get_context('app', base_source='phatch'))