• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /macosx-10.10/pyobjc-45/2.5/pyobjc/pyobjc-framework-Cocoa/Examples/AppKit/PyObjCLauncher/
1from Foundation import *
2from AppKit import *
3
4class FileSettings(NSObject):
5    fsdefault_py = None
6    fsdefault_pyw = None
7    fsdefault_pyc = None
8    default_py = None
9    default_pyw = None
10    default_pyc = None
11    factorySettings = None
12    prefskey = None
13    settings = None
14
15    def getFactorySettingsForFileType_(cls, filetype):
16        if filetype == u'Python Script':
17            curdefault = cls.fsdefault_py
18        elif filetype == u'Python GUI Script':
19            curdefault = cls.fsdefault_pyw
20        elif filetype == u'Python Bytecode Document':
21            curdefault = cls.fsdefault_pyc
22        else:
23            NSLog(u'Funny File Type: %s\n' % (filetype,))
24            curdefault = cls.fsdefault_py
25            filetype = u'Python Script'
26        if curdefault is None:
27            curdefault = FileSettings.alloc().initForFSDefaultFileType_(filetype)
28        return curdefault
29    getFactorySettingsForFileType_ = classmethod(getFactorySettingsForFileType_)
30
31    def getDefaultsForFileType_(cls, filetype):
32        if filetype == u'Python Script':
33            curdefault = cls.default_py
34        elif filetype == u'Python GUI Script':
35            curdefault = cls.default_pyw
36        elif filetype == u'Python Bytecode Document':
37            curdefault = cls.default_pyc
38        else:
39            NSLog(u'Funny File Type: %s\n' % (filetype,))
40            curdefault = cls.default_py
41            filetype = u'Python Script'
42        if curdefault is None:
43            curdefault = FileSettings.alloc().initForDefaultFileType_(filetype)
44        return curdefault
45    getDefaultsForFileType_ = classmethod(getDefaultsForFileType_)
46
47    def newSettingsForFileType_(cls, filetype):
48        return FileSettings.alloc().initForFileType_(filetype)
49    newSettingsForFileType_ = classmethod(newSettingsForFileType_)
50
51    def initWithFileSettings_(self, source):
52        self = super(FileSettings, self).init()
53        self.settings = source.fileSettingsAsDict().copy()
54        self.origsource = None
55        return self
56
57    def initForFileType_(self, filetype):
58        defaults = FileSettings.getDefaultsForFileType_(filetype)
59        self = self.initWithFileSettings_(defaults)
60        self.origsource = defaults
61        return self
62
63    def initForFSDefaultFileType_(self, filetype):
64        self = super(FileSettings, self).init()
65        if type(self).factorySettings is None:
66            bndl = NSBundle.mainBundle()
67            path = bndl.pathForResource_ofType_(u'factorySettings', u'plist')
68            type(self).factorySettings = NSDictionary.dictionaryWithContentsOfFile_(path)
69            if type(self).factorySettings is None:
70                NSLog(u'Missing %s' % (path,))
71                return None
72        dct = type(self).factorySettings.get(filetype)
73        if dct is None:
74            NSLog(u'factorySettings.plist misses file type "%s"' % (filetype,))
75            return None
76
77        self.applyValuesFromDict_(dct)
78        interpreters = dct[u'interpreter_list']
79        mgr = NSFileManager.defaultManager()
80        self.settings['interpreter'] = u'no default found'
81        for filename in interpreters:
82            filename = filename.nsstring().stringByExpandingTildeInPath()
83            if mgr.fileExistsAtPath_(filename):
84                self.settings['interpreter'] = filename
85                break
86        self.origsource = None
87        return self
88
89    def applyUserDefaults_(self, filetype):
90        dct = NSUserDefaults.standardUserDefaults().dictionaryForKey_(filetype)
91        if dct:
92            self.applyValuesFromDict_(dct)
93
94    def initForDefaultFileType_(self, filetype):
95        fsdefaults = FileSettings.getFactorySettingsForFileType_(filetype)
96        self = self.initWithFileSettings_(fsdefaults)
97        if self is None:
98            return self
99        self.settings['interpreter_list'] = fsdefaults.settings['interpreter_list']
100        self.settings['scriptargs'] = u''
101        self.applyUserDefaults_(filetype)
102        self.prefskey = filetype
103        return self
104
105    def reset(self):
106        if self.origsource:
107            self.updateFromSource_(self.origsource)
108        else:
109            fsdefaults = FileSettings.getFactorySettingsForFileType_(self.prefskey)
110            self.updateFromSource_(fsdefaults)
111
112    def updateFromSource_(self, source):
113        self.settings.update(source.fileSettingsAsDict())
114        if self.origsource is None:
115            NSUserDefaults.standardUserDefaults().setObject_forKey_(self.fileSettingsAsDict(), self.prefskey)
116
117    def applyValuesFromDict_(self, dct):
118        if self.settings is None:
119            self.settings = {}
120        self.settings.update(dct)
121
122    def commandLineForScript_(self, script):
123        cur_interp = None
124        if self.settings['honourhashbang']:
125            try:
126                line = file(script, 'rU').next().rstrip()
127            except:
128                pass
129            else:
130                if line.startswith('#!'):
131                    cur_interp = line[2:]
132        if cur_interp is None:
133            cur_interp = self.settings['interpreter']
134        cmd = []
135        cmd.append('"'+cur_interp.replace('"', '\\"')+'"')
136        if self.settings['debug']:
137            cmd.append('-d')
138        if self.settings['verbose']:
139            cmd.append('-v')
140        if self.settings['inspect']:
141            cmd.append('-i')
142        if self.settings['optimize']:
143            cmd.append('-O')
144        if self.settings['nosite']:
145            cmd.append('-S')
146        if self.settings['tabs']:
147            cmd.append('-t')
148        others = self.settings['others']
149        if others:
150            cmd.append(others)
151        cmd.append('"'+script.replace('"', '\\"')+'"')
152        cmd.append(self.settings['scriptargs'])
153        if self.settings['with_terminal']:
154            cmd.append("""&& echo "Exit status: $?" && python -c 'import sys;sys.stdin.readline()' && exit 1""")
155        else:
156            cmd.append('&')
157        return ' '.join(cmd)
158
159    def fileSettingsAsDict(self):
160        return self.settings
161