]> granicus.if.org Git - python/commitdiff
Move Mac/OSX/Tools one level up
authorRonald Oussoren <ronaldoussoren@mac.com>
Wed, 7 Jun 2006 18:57:44 +0000 (18:57 +0000)
committerRonald Oussoren <ronaldoussoren@mac.com>
Wed, 7 Jun 2006 18:57:44 +0000 (18:57 +0000)
Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py [new file with mode: 0644]
Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py [new file with mode: 0644]
Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py [new file with mode: 0644]
Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py [new file with mode: 0644]
Mac/Tools/Doc/HelpIndexingTool/__init__.py [new file with mode: 0644]
Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py [new file with mode: 0644]
Mac/Tools/Doc/README [new file with mode: 0644]
Mac/Tools/Doc/setup.py [new file with mode: 0644]
Mac/Tools/fixapplepython23.py [new file with mode: 0644]
Mac/Tools/pythonw.c [new file with mode: 0644]

diff --git a/Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py b/Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py
new file mode 100644 (file)
index 0000000..58d7307
--- /dev/null
@@ -0,0 +1,110 @@
+"""Suite Help Indexing Tool Suite: Special events that just the Help Indexing Tool supports.
+Level 0, version 0
+
+Generated from /Developer/Applications/Apple Help Indexing Tool.app
+AETE/AEUT resource version 1/1, language 0, script 0
+"""
+
+import aetools
+import MacOS
+
+_code = 'HIT '
+
+class Help_Indexing_Tool_Suite_Events:
+
+    def turn_anchor_indexing(self, _object, _attributes={}, **_arguments):
+        """turn anchor indexing: Turns anchor indexing on or off.
+        Required argument: \xd2on\xd3 or \xd2off\xd3, to turn anchor indexing on or off
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'HIT '
+        _subcode = 'tAnc'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    _argmap_turn_remote_root = {
+        'with_root_url' : 'rURL',
+    }
+
+    def turn_remote_root(self, _object, _attributes={}, **_arguments):
+        """turn remote root: Turn usage of remote root for content on the web on or off. If turning \xd2on\xd3, supply a string as second parameter.
+        Required argument: \xd2on\xd3 or \xd2off\xd3, to turn remote root on or off
+        Keyword argument with_root_url: The remote root to use, in the form of \xd2http://www.apple.com/help/\xd3.
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'HIT '
+        _subcode = 'tRem'
+
+        aetools.keysubst(_arguments, self._argmap_turn_remote_root)
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    def use_tokenizer(self, _object, _attributes={}, **_arguments):
+        """use tokenizer: Tells the indexing tool which tokenizer to use.
+        Required argument: Specify \xd2English\xd3, \xd2European\xd3, \xd2Japanese\xd3, \xd2Korean\xd3, or \xd2Simple\xd3.
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'HIT '
+        _subcode = 'uTok'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+
+class application(aetools.ComponentItem):
+    """application - Application class """
+    want = 'capp'
+class _Prop_idleStatus(aetools.NProperty):
+    """idleStatus -  """
+    which = 'sIdl'
+    want = 'bool'
+application._superclassnames = []
+application._privpropdict = {
+    'idleStatus' : _Prop_idleStatus,
+}
+application._privelemdict = {
+}
+
+#
+# Indices of types declared in this module
+#
+_classdeclarations = {
+    'capp' : application,
+}
+
+_propdeclarations = {
+    'sIdl' : _Prop_idleStatus,
+}
+
+_compdeclarations = {
+}
+
+_enumdeclarations = {
+}
diff --git a/Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py b/Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py
new file mode 100644 (file)
index 0000000..3cf745f
--- /dev/null
@@ -0,0 +1,49 @@
+"""Suite Miscellaneous Standards: Useful events that aren\xd5t in any other suite
+Level 0, version 0
+
+Generated from /Developer/Applications/Apple Help Indexing Tool.app
+AETE/AEUT resource version 1/1, language 0, script 0
+"""
+
+import aetools
+import MacOS
+
+_code = 'misc'
+
+class Miscellaneous_Standards_Events:
+
+    def revert(self, _object, _attributes={}, **_arguments):
+        """revert: Revert an object to the most recently saved version
+        Required argument: object to revert
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'misc'
+        _subcode = 'rvrt'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+
+#
+# Indices of types declared in this module
+#
+_classdeclarations = {
+}
+
+_propdeclarations = {
+}
+
+_compdeclarations = {
+}
+
+_enumdeclarations = {
+}
diff --git a/Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py b/Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py
new file mode 100644 (file)
index 0000000..eb9fee0
--- /dev/null
@@ -0,0 +1,32 @@
+"""Suite Required Suite: Terms that every application should support
+Level 1, version 1
+
+Generated from /Developer/Applications/Apple Help Indexing Tool.app
+AETE/AEUT resource version 1/1, language 0, script 0
+"""
+
+import aetools
+import MacOS
+
+_code = 'reqd'
+
+from StdSuites.Required_Suite import *
+class Required_Suite_Events(Required_Suite_Events):
+
+    pass
+
+
+#
+# Indices of types declared in this module
+#
+_classdeclarations = {
+}
+
+_propdeclarations = {
+}
+
+_compdeclarations = {
+}
+
+_enumdeclarations = {
+}
diff --git a/Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py b/Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py
new file mode 100644 (file)
index 0000000..4f6604c
--- /dev/null
@@ -0,0 +1,343 @@
+"""Suite Standard Suite: Common terms for most applications
+Level 1, version 1
+
+Generated from /Developer/Applications/Apple Help Indexing Tool.app
+AETE/AEUT resource version 1/1, language 0, script 0
+"""
+
+import aetools
+import MacOS
+
+_code = 'CoRe'
+
+from StdSuites.Standard_Suite import *
+class Standard_Suite_Events(Standard_Suite_Events):
+
+    _argmap_close = {
+        'saving' : 'savo',
+        'in_' : 'kfil',
+    }
+
+    def close(self, _object, _attributes={}, **_arguments):
+        """close: Close an object
+        Required argument: the objects to close
+        Keyword argument saving: specifies whether or not changes should be saved before closing
+        Keyword argument in_: the file in which to save the object
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'core'
+        _subcode = 'clos'
+
+        aetools.keysubst(_arguments, self._argmap_close)
+        _arguments['----'] = _object
+
+        aetools.enumsubst(_arguments, 'savo', _Enum_savo)
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    def data_size(self, _object, _attributes={}, **_arguments):
+        """data size: Return the size in bytes of an object
+        Required argument: the object whose data size is to be returned
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        Returns: the size of the object in bytes
+        """
+        _code = 'core'
+        _subcode = 'dsiz'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    def get(self, _object, _attributes={}, **_arguments):
+        """get: Get the data for an object
+        Required argument: the object whose data is to be returned
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        Returns: The data from the object
+        """
+        _code = 'core'
+        _subcode = 'getd'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    _argmap_make = {
+        'new' : 'kocl',
+        'at' : 'insh',
+        'with_data' : 'data',
+        'with_properties' : 'prdt',
+    }
+
+    def make(self, _no_object=None, _attributes={}, **_arguments):
+        """make: Make a new element
+        Keyword argument new: the class of the new element
+        Keyword argument at: the location at which to insert the element
+        Keyword argument with_data: the initial data for the element
+        Keyword argument with_properties: the initial values for the properties of the element
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        Returns: Object specifier for the new element
+        """
+        _code = 'core'
+        _subcode = 'crel'
+
+        aetools.keysubst(_arguments, self._argmap_make)
+        if _no_object != None: raise TypeError, 'No direct arg expected'
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    def open(self, _object, _attributes={}, **_arguments):
+        """open: Open the specified object(s)
+        Required argument: Objects to open. Can be a list of files or an object specifier.
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'aevt'
+        _subcode = 'odoc'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    def print_(self, _object, _attributes={}, **_arguments):
+        """print: Print the specified object(s)
+        Required argument: Objects to print. Can be a list of files or an object specifier.
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'aevt'
+        _subcode = 'pdoc'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    _argmap_save = {
+        'in_' : 'kfil',
+        'as' : 'fltp',
+    }
+
+    def save(self, _object, _attributes={}, **_arguments):
+        """save: save a set of objects
+        Required argument: Objects to save.
+        Keyword argument in_: the file in which to save the object(s)
+        Keyword argument as: the file type of the document in which to save the data
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'core'
+        _subcode = 'save'
+
+        aetools.keysubst(_arguments, self._argmap_save)
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+    _argmap_set = {
+        'to' : 'data',
+    }
+
+    def set(self, _object, _attributes={}, **_arguments):
+        """set: Set an object\xd5s data
+        Required argument: the object to change
+        Keyword argument to: the new value
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'core'
+        _subcode = 'setd'
+
+        aetools.keysubst(_arguments, self._argmap_set)
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+
+class application(aetools.ComponentItem):
+    """application - An application program """
+    want = 'capp'
+#        element 'cwin' as ['indx', 'name', 'rele']
+#        element 'docu' as ['name']
+
+class window(aetools.ComponentItem):
+    """window - A Window """
+    want = 'cwin'
+class _Prop_bounds(aetools.NProperty):
+    """bounds - the boundary rectangle for the window """
+    which = 'pbnd'
+    want = 'qdrt'
+class _Prop_closeable(aetools.NProperty):
+    """closeable - Does the window have a close box? """
+    which = 'hclb'
+    want = 'bool'
+class _Prop_floating(aetools.NProperty):
+    """floating - Does the window float? """
+    which = 'isfl'
+    want = 'bool'
+class _Prop_index(aetools.NProperty):
+    """index - the number of the window """
+    which = 'pidx'
+    want = 'long'
+class _Prop_modal(aetools.NProperty):
+    """modal - Is the window modal? """
+    which = 'pmod'
+    want = 'bool'
+class _Prop_name(aetools.NProperty):
+    """name - the title of the window """
+    which = 'pnam'
+    want = 'itxt'
+class _Prop_position(aetools.NProperty):
+    """position - upper left coordinates of window """
+    which = 'ppos'
+    want = 'QDpt'
+class _Prop_resizable(aetools.NProperty):
+    """resizable - Is the window resizable? """
+    which = 'prsz'
+    want = 'bool'
+class _Prop_titled(aetools.NProperty):
+    """titled - Does the window have a title bar? """
+    which = 'ptit'
+    want = 'bool'
+class _Prop_visible(aetools.NProperty):
+    """visible - is the window visible? """
+    which = 'pvis'
+    want = 'bool'
+class _Prop_zoomable(aetools.NProperty):
+    """zoomable - Is the window zoomable? """
+    which = 'iszm'
+    want = 'bool'
+class _Prop_zoomed(aetools.NProperty):
+    """zoomed - Is the window zoomed? """
+    which = 'pzum'
+    want = 'bool'
+
+class document(aetools.ComponentItem):
+    """document - A Document """
+    want = 'docu'
+class _Prop_modified(aetools.NProperty):
+    """modified - Has the document been modified since the last save? """
+    which = 'imod'
+    want = 'bool'
+application._superclassnames = []
+application._privpropdict = {
+}
+application._privelemdict = {
+    'document' : document,
+    'window' : window,
+}
+window._superclassnames = []
+window._privpropdict = {
+    'bounds' : _Prop_bounds,
+    'closeable' : _Prop_closeable,
+    'floating' : _Prop_floating,
+    'index' : _Prop_index,
+    'modal' : _Prop_modal,
+    'name' : _Prop_name,
+    'position' : _Prop_position,
+    'resizable' : _Prop_resizable,
+    'titled' : _Prop_titled,
+    'visible' : _Prop_visible,
+    'zoomable' : _Prop_zoomable,
+    'zoomed' : _Prop_zoomed,
+}
+window._privelemdict = {
+}
+document._superclassnames = []
+document._privpropdict = {
+    'modified' : _Prop_modified,
+    'name' : _Prop_name,
+}
+document._privelemdict = {
+}
+_Enum_savo = {
+    'yes' : 'yes ',     # Save objects now
+    'no' : 'no  ',      # Do not save objects
+    'ask' : 'ask ',     # Ask the user whether to save
+}
+
+
+#
+# Indices of types declared in this module
+#
+_classdeclarations = {
+    'capp' : application,
+    'cwin' : window,
+    'docu' : document,
+}
+
+_propdeclarations = {
+    'hclb' : _Prop_closeable,
+    'imod' : _Prop_modified,
+    'isfl' : _Prop_floating,
+    'iszm' : _Prop_zoomable,
+    'pbnd' : _Prop_bounds,
+    'pidx' : _Prop_index,
+    'pmod' : _Prop_modal,
+    'pnam' : _Prop_name,
+    'ppos' : _Prop_position,
+    'prsz' : _Prop_resizable,
+    'ptit' : _Prop_titled,
+    'pvis' : _Prop_visible,
+    'pzum' : _Prop_zoomed,
+}
+
+_compdeclarations = {
+}
+
+_enumdeclarations = {
+    'savo' : _Enum_savo,
+}
diff --git a/Mac/Tools/Doc/HelpIndexingTool/__init__.py b/Mac/Tools/Doc/HelpIndexingTool/__init__.py
new file mode 100644 (file)
index 0000000..5359df5
--- /dev/null
@@ -0,0 +1,78 @@
+"""
+Package generated from /Developer/Applications/Apple Help Indexing Tool.app
+"""
+import aetools
+Error = aetools.Error
+import Standard_Suite
+import Help_Indexing_Tool_Suite
+import odds_and_ends
+import Miscellaneous_Standards
+import Required_Suite
+
+
+_code_to_module = {
+    'CoRe' : Standard_Suite,
+    'HIT ' : Help_Indexing_Tool_Suite,
+    'Odds' : odds_and_ends,
+    'misc' : Miscellaneous_Standards,
+    'reqd' : Required_Suite,
+}
+
+
+
+_code_to_fullname = {
+    'CoRe' : ('HelpIndexingTool.Standard_Suite', 'Standard_Suite'),
+    'HIT ' : ('HelpIndexingTool.Help_Indexing_Tool_Suite', 'Help_Indexing_Tool_Suite'),
+    'Odds' : ('HelpIndexingTool.odds_and_ends', 'odds_and_ends'),
+    'misc' : ('HelpIndexingTool.Miscellaneous_Standards', 'Miscellaneous_Standards'),
+    'reqd' : ('HelpIndexingTool.Required_Suite', 'Required_Suite'),
+}
+
+from Standard_Suite import *
+from Help_Indexing_Tool_Suite import *
+from odds_and_ends import *
+from Miscellaneous_Standards import *
+from Required_Suite import *
+
+def getbaseclasses(v):
+    if not getattr(v, '_propdict', None):
+        v._propdict = {}
+        v._elemdict = {}
+        for superclassname in getattr(v, '_superclassnames', []):
+            superclass = eval(superclassname)
+            getbaseclasses(superclass)
+            v._propdict.update(getattr(superclass, '_propdict', {}))
+            v._elemdict.update(getattr(superclass, '_elemdict', {}))
+        v._propdict.update(getattr(v, '_privpropdict', {}))
+        v._elemdict.update(getattr(v, '_privelemdict', {}))
+
+import StdSuites
+
+#
+# Set property and element dictionaries now that all classes have been defined
+#
+getbaseclasses(window)
+getbaseclasses(application)
+getbaseclasses(document)
+getbaseclasses(application)
+
+#
+# Indices of types declared in this module
+#
+_classdeclarations = {
+    'cwin' : window,
+    'capp' : application,
+    'docu' : document,
+    'capp' : application,
+}
+
+
+class HelpIndexingTool(Standard_Suite_Events,
+        Help_Indexing_Tool_Suite_Events,
+        odds_and_ends_Events,
+        Miscellaneous_Standards_Events,
+        Required_Suite_Events,
+        aetools.TalkTo):
+    _signature = 'hiti'
+
+    _moduleName = 'HelpIndexingTool'
diff --git a/Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py b/Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py
new file mode 100644 (file)
index 0000000..7ee46f3
--- /dev/null
@@ -0,0 +1,49 @@
+"""Suite odds and ends: Things that should be in some standard suite, but aren\xd5t
+Level 1, version 1
+
+Generated from /Developer/Applications/Apple Help Indexing Tool.app
+AETE/AEUT resource version 1/1, language 0, script 0
+"""
+
+import aetools
+import MacOS
+
+_code = 'Odds'
+
+class odds_and_ends_Events:
+
+    def select(self, _object=None, _attributes={}, **_arguments):
+        """select: Select the specified object
+        Required argument: the object to select
+        Keyword argument _attributes: AppleEvent attribute dictionary
+        """
+        _code = 'misc'
+        _subcode = 'slct'
+
+        if _arguments: raise TypeError, 'No optional args expected'
+        _arguments['----'] = _object
+
+
+        _reply, _arguments, _attributes = self.send(_code, _subcode,
+                _arguments, _attributes)
+        if _arguments.get('errn', 0):
+            raise aetools.Error, aetools.decodeerror(_arguments)
+        # XXXX Optionally decode result
+        if _arguments.has_key('----'):
+            return _arguments['----']
+
+
+#
+# Indices of types declared in this module
+#
+_classdeclarations = {
+}
+
+_propdeclarations = {
+}
+
+_compdeclarations = {
+}
+
+_enumdeclarations = {
+}
diff --git a/Mac/Tools/Doc/README b/Mac/Tools/Doc/README
new file mode 100644 (file)
index 0000000..4f4d53d
--- /dev/null
@@ -0,0 +1,35 @@
+In this directory you can build the Python documentation in a form that
+is suitable for access with Apple Help Viewer. This will enable the
+"Python Documentation" menu entries in the MacPython IDE Help menu.
+
+Unfortunately the procedure to build the docs is not very streamlined.
+
+First, edit setup.py. At the top, edit MAJOR_VERSION and MINOR_VERSION,
+and check that DESTDIR makes sense. The documentation will be installed
+inside PythonIDE.app.
+
+In DocBuild.initialize_options, set self.download to True if you want to
+download the docs. Set it to False if you want to build the docs from
+the source tree, but this requires LaTex and lots of other stuff.
+Doable, but not easy.
+
+Second, if you want to download the docs you may need to do a couple
+more edits. The way the docs are packaged will often change between
+major releases. Fiddle DocBuild.downloadDocs to make it do the right
+thing (download the docs from python.org, unpack them, rename the
+directory to "build/html").
+
+After these edits you should be ready to roll. "pythonw setup.py build"
+should download and unpack (or build) the docs. Next, it will do some
+magic to make the docs indexable. Finally, it will run the Apple Help
+Indexing Tool. (This last step is the reason you must use "pythonw" as
+opposed to "python"). Usually it will time out while waiting for AHIT to
+do its work. Wait until AHIT is done.
+
+Now you're ready to install with "python setup.py install".
+
+After this is done test your work. Fire up PythonIDE, and check that
+Help->Python Documentation brings up the documentation in the Help Viewer.
+Also open an IDE edit window, type something like "import sys", select
+"import", and use Help->Lookup in Python Documentation to check that the
+index has been generated correctly.
diff --git a/Mac/Tools/Doc/setup.py b/Mac/Tools/Doc/setup.py
new file mode 100644 (file)
index 0000000..bd86a20
--- /dev/null
@@ -0,0 +1,214 @@
+# Build and install an Apple Help Viewer compatible version of the Python
+# documentation into the framework.
+# Code by Bill Fancher, with some modifications by Jack Jansen.
+#
+# You must run this as a two-step process
+# 1. python setupDocs.py build
+# 2. Wait for Apple Help Indexing Tool to finish
+# 3. python setupDocs.py install
+#
+# To do:
+# - test whether the docs are available locally before downloading
+# - fix buildDocsFromSource
+# - Get documentation version from sys.version, fallback to 2.2.1
+# - See if we can somehow detect that Apple Help Indexing Tool is finished
+# - data_files to setup() doesn't seem the right way to pass the arguments
+#
+import sys, os, re
+from distutils.cmd import Command
+from distutils.command.build import build
+from distutils.core import setup
+from distutils.file_util import copy_file
+from distutils.dir_util import copy_tree
+from distutils.log import log
+from distutils.spawn import spawn
+from distutils import sysconfig, dep_util
+from distutils.util import change_root
+import HelpIndexingTool
+import Carbon.File
+import time
+
+MAJOR_VERSION='2.4'
+MINOR_VERSION='2.4.1'
+DESTDIR='/Applications/MacPython-%s/PythonIDE.app/Contents/Resources/English.lproj/PythonDocumentation' % MAJOR_VERSION
+
+class DocBuild(build):
+    def initialize_options(self):
+        build.initialize_options(self)
+        self.build_html = None
+        self.build_dest = None
+        self.download = 1
+        self.doc_version = MINOR_VERSION # Only needed if download is true
+
+    def finalize_options(self):
+        build.finalize_options(self)
+        if self.build_html is None:
+            self.build_html = os.path.join(self.build_base, 'html')
+        if self.build_dest is None:
+            self.build_dest = os.path.join(self.build_base, 'PythonDocumentation')
+
+    def spawn(self, *args):
+        spawn(args, 1,  self.verbose, self.dry_run)
+
+    def downloadDocs(self):
+        workdir = os.getcwd()
+        # XXX Note: the next strings may change from version to version
+        url = 'http://www.python.org/ftp/python/doc/%s/html-%s.tar.bz2' % \
+                (self.doc_version,self.doc_version)
+        tarfile = 'html-%s.tar.bz2' % self.doc_version
+        dirname = 'Python-Docs-%s' % self.doc_version
+
+        if os.path.exists(self.build_html):
+            raise RuntimeError, '%s: already exists, please remove and try again' % self.build_html
+        os.chdir(self.build_base)
+        self.spawn('curl','-O', url)
+        self.spawn('tar', '-xjf', tarfile)
+        os.rename(dirname, 'html')
+        os.chdir(workdir)
+##        print "** Please unpack %s" % os.path.join(self.build_base, tarfile)
+##        print "** Unpack the files into %s" % self.build_html
+##        raise RuntimeError, "You need to unpack the docs manually"
+
+    def buildDocsFromSource(self):
+        srcdir = '../../..'
+        docdir = os.path.join(srcdir, 'Doc')
+        htmldir = os.path.join(docdir, 'html')
+        spawn(('make','--directory', docdir, 'html'), 1, self.verbose, self.dry_run)
+        self.mkpath(self.build_html)
+        copy_tree(htmldir, self.build_html)
+
+    def ensureHtml(self):
+        if not os.path.exists(self.build_html):
+            if self.download:
+                self.downloadDocs()
+            else:
+                self.buildDocsFromSource()
+
+    def hackIndex(self):
+        ind_html = 'index.html'
+        #print 'self.build_dest =', self.build_dest
+        hackedIndex = file(os.path.join(self.build_dest, ind_html),'w')
+        origIndex = file(os.path.join(self.build_html,ind_html))
+        r = re.compile('<style type="text/css">.*</style>', re.DOTALL)
+        hackedIndex.write(r.sub('<META NAME="AppleTitle" CONTENT="Python Documentation">',origIndex.read()))
+
+    def hackFile(self,d,f):
+        origPath = os.path.join(d,f)
+        assert(origPath[:len(self.build_html)] == self.build_html)
+        outPath = os.path.join(self.build_dest, d[len(self.build_html)+1:], f)
+        (name, ext) = os.path.splitext(f)
+        if os.path.isdir(origPath):
+            self.mkpath(outPath)
+        elif ext == '.html':
+            if self.verbose: print 'hacking %s to %s' % (origPath,outPath)
+            hackedFile = file(outPath, 'w')
+            origFile = file(origPath,'r')
+            hackedFile.write(self.r.sub('<dl><dt><dd>', origFile.read()))
+        else:
+            copy_file(origPath, outPath)
+
+    def hackHtml(self):
+        self.r = re.compile('<dl><dd>')
+        os.path.walk(self.build_html, self.visit, None)
+
+    def visit(self, dummy, dirname, filenames):
+        for f in filenames:
+            self.hackFile(dirname, f)
+
+    def makeHelpIndex(self):
+        app = '/Developer/Applications/Apple Help Indexing Tool.app'
+        self.spawn('open', '-a', app , self.build_dest)
+        print "Please wait until Apple Help Indexing Tool finishes before installing"
+
+    def makeHelpIndex(self):
+        app = HelpIndexingTool.HelpIndexingTool(start=1)
+        app.open(Carbon.File.FSSpec(self.build_dest))
+        sys.stderr.write("Waiting for Help Indexing Tool to start...")
+        while 1:
+            # This is bad design in the suite generation code!
+            idle = app._get(HelpIndexingTool.Help_Indexing_Tool_Suite._Prop_idleStatus())
+            time.sleep(10)
+            if not idle: break
+            sys.stderr.write(".")
+        sys.stderr.write("\n")
+        sys.stderr.write("Waiting for Help Indexing Tool to finish...")
+        while 1:
+            # This is bad design in the suite generation code!
+            idle = app._get(HelpIndexingTool.Help_Indexing_Tool_Suite._Prop_idleStatus())
+            time.sleep(10)
+            if idle: break
+            sys.stderr.write(".")
+        sys.stderr.write("\n")
+
+
+    def run(self):
+        self.ensure_finalized()
+        self.mkpath(self.build_base)
+        self.ensureHtml()
+        if not os.path.isdir(self.build_html):
+            raise RuntimeError, \
+            "Can't find source folder for documentation."
+        self.mkpath(self.build_dest)
+        if dep_util.newer(os.path.join(self.build_html,'index.html'), os.path.join(self.build_dest,'index.html')):
+            self.mkpath(self.build_dest)
+            self.hackHtml()
+            self.hackIndex()
+            self.makeHelpIndex()
+
+class AHVDocInstall(Command):
+    description = "install Apple Help Viewer html files"
+    user_options = [('install-doc=', 'd',
+            'directory to install HTML tree'),
+             ('root=', None,
+             "install everything relative to this alternate root directory"),
+            ]
+
+    def initialize_options(self):
+        self.build_dest = None
+        self.install_doc = None
+        self.prefix = None
+        self.root = None
+
+    def finalize_options(self):
+        self.set_undefined_options('install',
+                ('prefix', 'prefix'),
+                ('root', 'root'))
+#               import pdb ; pdb.set_trace()
+        build_cmd = self.get_finalized_command('build')
+        if self.build_dest == None:
+            build_cmd = self.get_finalized_command('build')
+            self.build_dest = build_cmd.build_dest
+        if self.install_doc == None:
+            self.install_doc = os.path.join(self.prefix, DESTDIR)
+        print 'INSTALL', self.build_dest, '->', self.install_doc
+
+    def run(self):
+        self.finalize_options()
+        self.ensure_finalized()
+        print "Running Installer"
+        instloc = self.install_doc
+        if self.root:
+            instloc = change_root(self.root, instloc)
+        self.mkpath(instloc)
+        copy_tree(self.build_dest, instloc)
+        print "Installation complete"
+
+def mungeVersion(infile, outfile):
+    i = file(infile,'r')
+    o = file(outfile,'w')
+    o.write(re.sub('\$\(VERSION\)',sysconfig.get_config_var('VERSION'),i.read()))
+    i.close()
+    o.close()
+
+def main():
+    # turn off warnings when deprecated modules are imported
+##      import warnings
+##      warnings.filterwarnings("ignore",category=DeprecationWarning)
+    setup(name = 'Documentation',
+            version = '%d.%d' % sys.version_info[:2],
+            cmdclass = {'install_data':AHVDocInstall, 'build':DocBuild},
+            data_files = ['dummy'],
+            )
+
+if __name__ == '__main__':
+    main()
diff --git a/Mac/Tools/fixapplepython23.py b/Mac/Tools/fixapplepython23.py
new file mode 100644 (file)
index 0000000..ef352ce
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/bin/python
+"""fixapplepython23 - Fix Apple-installed Python 2.3 (on Mac OS X 10.3)
+
+Python 2.3 (and 2.3.X for X<5) have the problem that building an extension
+for a framework installation may accidentally pick up the framework
+of a newer Python, in stead of the one that was used to build the extension.
+
+This script modifies the Makefile (in .../lib/python2.3/config) to use
+the newer method of linking extensions with "-undefined dynamic_lookup"
+which fixes this problem.
+
+The script will first check all prerequisites, and return a zero exit
+status also when nothing needs to be fixed.
+"""
+import sys
+import os
+import gestalt
+
+MAKEFILE='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/Makefile'
+CHANGES=((
+    'LDSHARED=\t$(CC) $(LDFLAGS) -bundle -framework $(PYTHONFRAMEWORK)\n',
+    'LDSHARED=\t$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup\n'
+    ),(
+    'BLDSHARED=\t$(CC) $(LDFLAGS) -bundle -framework $(PYTHONFRAMEWORK)\n',
+    'BLDSHARED=\t$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup\n'
+    ),(
+    'CC=\t\tgcc\n',
+    'CC=\t\t/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-gcc\n'
+    ),(
+    'CXX=\t\tc++\n',
+    'CXX=\t\t/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-g++\n'
+))
+
+GCC_SCRIPT='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-gcc'
+GXX_SCRIPT='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-g++'
+SCRIPT="""#!/bin/sh
+export MACOSX_DEPLOYMENT_TARGET=10.3
+exec %s "${@}"
+"""
+
+def findline(lines, start):
+    """return line starting with given string or -1"""
+    for i in range(len(lines)):
+        if lines[i][:len(start)] == start:
+            return i
+    return -1
+
+def fix(makefile, do_apply):
+    """Fix the Makefile, if required."""
+    fixed = False
+    lines = open(makefile).readlines()
+
+    for old, new in CHANGES:
+        i = findline(lines, new)
+        if i >= 0:
+            # Already fixed
+            continue
+        i = findline(lines, old)
+        if i < 0:
+            print 'fixapplepython23: Python installation not fixed (appears broken)'
+            print 'fixapplepython23: missing line:', old
+            return 2
+        lines[i] = new
+        fixed = True
+
+    if fixed:
+        if do_apply:
+            print 'fixapplepython23: Fix to Apple-installed Python 2.3 applied'
+            os.rename(makefile, makefile + '~')
+            open(makefile, 'w').writelines(lines)
+            return 0
+        else:
+            print 'fixapplepython23: Fix to Apple-installed Python 2.3 should be applied'
+            return 1
+    else:
+        print 'fixapplepython23: No fix needed, appears to have been applied before'
+        return 0
+
+def makescript(filename, compiler):
+    """Create a wrapper script for a compiler"""
+    dirname = os.path.split(filename)[0]
+    if not os.access(dirname, os.X_OK):
+        os.mkdir(dirname, 0755)
+    fp = open(filename, 'w')
+    fp.write(SCRIPT % compiler)
+    fp.close()
+    os.chmod(filename, 0755)
+    print 'fixapplepython23: Created', filename
+
+def main():
+    # Check for -n option
+    if len(sys.argv) > 1 and sys.argv[1] == '-n':
+        do_apply = False
+    else:
+        do_apply = True
+    # First check OS version
+    if gestalt.gestalt('sysv') < 0x1030:
+        print 'fixapplepython23: no fix needed on MacOSX < 10.3'
+        sys.exit(0)
+    # Test that a framework Python is indeed installed
+    if not os.path.exists(MAKEFILE):
+        print 'fixapplepython23: Python framework does not appear to be installed (?), nothing fixed'
+        sys.exit(0)
+    # Check that we can actually write the file
+    if do_apply and not os.access(MAKEFILE, os.W_OK):
+        print 'fixapplepython23: No write permission, please run with "sudo"'
+        sys.exit(2)
+    # Create the shell scripts
+    if do_apply:
+        if not os.access(GCC_SCRIPT, os.X_OK):
+            makescript(GCC_SCRIPT, "gcc")
+        if not os.access(GXX_SCRIPT, os.X_OK):
+            makescript(GXX_SCRIPT, "g++")
+    #  Finally fix the makefile
+    rv = fix(MAKEFILE, do_apply)
+    sys.exit(rv)
+
+if __name__ == '__main__':
+    main()
diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c
new file mode 100644 (file)
index 0000000..e70a76f
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * This wrapper program executes a python executable hidden inside an
+ * application bundle inside the Python framework. This is needed to run
+ * GUI code: some GUI API's don't work unless the program is inside an
+ * application bundle.
+ */
+#include <unistd.h>
+#include <err.h>
+
+static char Python[] = PYTHONWEXECUTABLE;
+
+int main(int argc, char **argv) {
+       argv[0] = Python;
+       execv(Python, argv);
+       err(1, "execv: %s", Python);
+       /* NOTREACHED */
+}