Commits

Ronald Oussoren committed 40780e1

Various small updates and bugfixes before the 2.5 release

Notable:

* Version number is now 2.5

* Add better interoperability with ctypes

* Fixes a crash in the conversion to/from PyCapsule objects

* Ensure PyObjC can be build for Python 2.x binaries that
don't have '--with-toolbox-glue' (such as EPD)

Comments (0)

Files changed (62)

pyobjc-core/Doc/api/module-objc.rst

    This class is the metatype for Objective-C classes and provides no user-visible
    behavior.
 
-.. class:: objc_object
+.. class:: objc_object([cobject, [c_void_p]])
 
    This class is the root class for Objective-C classes, that is all wrappers for
    Objective-C classes are a subclass of this class. It is not possible to instantiate
    instances of Objective-C classes by using the class as a callable, instances are
    created using the standard Objective-C mechanisms instead.
 
+   The *cobject* and *c_void_p* arguments should always be passed as keyword arguments,
+   and at most one of them should be provided. This will construct a proxy object of the
+   right subclass of :class:`objc_object` for the Cocoa object that the passed in value
+   refers to. *Cobject* should be a Pytho capsule created using the :meth:`__cobject__`
+   method, *c_void_p* should be a :class:`ctypes.c_void_p`.
+
+   .. note:: 
+   
+      The normal way to create instances of (subclasses of) :class:`objc_object` is
+      to call the normal Cocoa allocation method. Calling the class should only be used
+      to contruct a proxy from a pre-existing pointer value (for interoperability with
+      other libraries).
+
+         
+
    .. data:: pyobjc_ISA
 
       Read-only property that returns the current Objective-C classes of an object.
       Returns a capsule object with identifier "objc.__object__" and the a reference
       to the Objective-C object as the value.
 
+   .. method:: __c_void_p__()
+
+      Returns a :class:`ctypes.c_void_p` instance for this object.
+
    .. method:: __reduce__()
 
       This method ensures that Objective-C objects will not be pickled unless the subclass

pyobjc-core/Doc/intro.rst

 ..	:authors: Ronald Oussoren, Bob Ippolito
 	:contact: pyobjc-dev@lists.sourceforge.net
 	:URL: http://pyobjc.sourceforge.net/
-	:copyright: 2003-2005 The PyObjC Project
+	:copyright: 2003-2013 The PyObjC Project
 
 Preface
 -------
 
 Wrapped/bridged methods (and functions) have the same number of arguments
 as the corresponding Objective-C method or function, unless otherwise noted
-in the documentation (`Notes on supported APIs and classes on Mac OS X`_ for
+in the documentation (:doc:`Notes on supported APIs and classes on Mac OS X </apinotes>` for
 Cocoa on Mac OS X).
 
-.. _`Notes on supported APIs and classes on Mac OS X`: :doc:`/apinotes`
-
 Most methods or functions that take or return pointers to values will be an
 exception to this rule if it is callable from Python at all.  In Objective-C
 terminology, there are three kinds of pointers that can be used in a method:
 actually an autoreleased object that will be cleaned up unless the Objective-C
 code increases its reference count.
 
-The document `Notes on supported APIs and classes on Mac OS X`_ contains 
+The document :doc:`Notes on supported APIs and classes on Mac OS X </apinotes>` contains 
 information about classes that work with weak references.  The most important
 are notification centers and ``NSOutlineView``, to be exact: the outline view
 stores weak references to the objects return by the method 

pyobjc-core/Doc/metadata/manual.rst

 * *arguments*: A dictionary containing more information on arguments. The keys of this dictionary are integers
   with the argument offset (for methods index 0 is the first implicit argument, index 2 is the first argument that is
   visible in a prototype). The values are metadata dictionaries for the arguments and are decribed 
-  `later on <Argument and return value metadata>`_.
+  :ref:`later on <manual-metadata-argument-metadata>`.
 
   In metadata that is returned the *__metadata__()* method of :class:`function` and :class:`selector` objects the
   *arguments* value is a tuple with items for all arguments.
 
 
 * *retval*: A metadata dictionary with more information on the return value. The contents of this dictionary
-  is described `later on <Argument and return value metadata>`_.
+  is described :ref:`later on <manual-metadata-argument-metadata>`.
 
 * *suggestion*: For methods only: the method should not be called from Python, and calling it will raise and exception
   with the *suggestion* value in the exception message.
  
 * In all other cases the length cannot be calculated and the bridge raises an exception.
 
+  .. _manual-metadata-argument-metadata:
+
 Argument and return value metadata
 ..................................
 

pyobjc-core/Doc/tutorials/embedded.rst

  * Xcode Tools
 
 If you do not have a ``/Developer`` folder, then you do not have Xcode Tools
-installed.  See `Getting the Xcode Tools`_.
-
-.. _`Getting the Xcode Tools`: http://developer.apple.com/tools/download/
+installed. On MacOSX 10.7 or later you can download Xcode from the App Store,
+see `Apple's developer website <https://developer.apple.com/xcode/>` for
+more information.
 
 The application we are going to modify is Apple's SimpleComboBox example.
 This example shows you how to use combo boxes, but that is not what interests

pyobjc-core/Doc/tutorials/firstapp.rst

 Creating your first PyObjC application.
 =======================================
 
-WARNING: This tutorial assumes you're using Xcode 2.5 and is therefore not 
-entirely valid with Xcode 3 (that is MacOS 10.5).
+.. warning::
+   
+   This document is old and hasn't been updated for modern versions of
+   PyObjC and Apple's developer tools.
 
 In this tutorial you will learn how to create your first Python Cocoa
 application: a simple dialog that allows you to convert amounts of money from
  * Xcode Tools (was Developer Tools for Mac OS X 10.2)
 
 If you do not have a ``/Developer`` folder, then you do not have Xcode Tools
-installed.  See `Getting the Xcode Tools`_.
-
-.. _`Getting the Xcode Tools`: http://developer.apple.com/tools/download/
+installed.  See `Apple's developer website <https://developer.apple.com/xcode/>`
+for more information on getting Xcode.
 
 Getting Started
 ---------------

pyobjc-core/License.txt

 (This is the MIT license, note that libffi-src is a separate product with its own license)
 
 Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al.
-Copyright 2003-2012 - Ronald Oussoren
+Copyright 2003-2013 - Ronald Oussoren
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 

pyobjc-core/Modules/objc/objc-object.m

 	PyObject* args,
 	PyObject* kwds)
 {
-static char* keywords[] = { "cobject", NULL };
-	PyObject* arg = NULL;
+static char* keywords[] = { "cobject", "c_void_p", NULL };
+	PyObject* cobject = NULL;
+	PyObject* c_void_p = NULL;
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", keywords, &arg)) {
+	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO", keywords, &cobject, &c_void_p)) {
 		return NULL;
 	}
 
-	if (arg == NULL || !PyCapsule_CheckExact(arg)) {
+	if (cobject != NULL && c_void_p != NULL) {
+		PyErr_SetString(PyExc_TypeError,
+				"Pass either cobject or c_void_p, but not both");
+		return NULL;
+	}
+
+	if (cobject != NULL && PyCapsule_CheckExact(cobject)) {
+		NSObject* p = PyCapsule_GetPointer(cobject, "objc.__object__");
+
+		return PyObjC_IdToPython(p);
+
+	} else if (c_void_p != NULL) {
+		NSObject* p;
+
+		PyObject* attrval = PyObject_GetAttrString(c_void_p, "value");
+		if (attrval == NULL) {
+			return NULL;
+		}
+
+		if (
+#if PY_MAJOR_VERSION == 2
+			PyInt_Check(attrval) ||
+			/* NOTE: PyLong_AsVoidPtr works on Int objects as well */
+#endif /* PY_MAJOR_VERSION == 2 */
+			PyLong_Check(attrval)
+		) {
+			p = PyLong_AsVoidPtr(attrval);
+			if (p == NULL && PyErr_Occurred()) {
+				Py_DECREF(attrval);
+				return NULL;
+			}
+
+		} else {
+			PyErr_SetString(PyExc_ValueError,
+				"c_void_p.value is not an integer");
+			return NULL;
+		}
+		Py_DECREF(attrval);
+		return PyObjC_IdToPython(p);
+
+	} else {
 		PyErr_SetString(PyExc_TypeError, 
 			"Use class methods to instantiate new Objective-C objects");
 		return NULL;
-	} else {
-		NSObject* v = PyCapsule_GetPointer(arg, "objc.__object__");
-
-		return pythonify_c_value(@encode(NSObject), &v);
 	}
 }
 
 	return PyCapsule_New(PyObjCObject_GetObject(self), "objc.__object__", NULL);
 }
 
+static PyObject*
+get_c_void_p(void)
+{
+static  PyObject* c_void_p = NULL;
+	if (c_void_p == NULL) {
+		PyObject* mod_ctypes = PyImport_ImportModule("ctypes");
+		if (mod_ctypes == NULL) {
+			/* ctypes is nota available */
+			return NULL;
+		}
+		c_void_p = PyObject_GetAttrString(mod_ctypes, "c_void_p");
+		Py_DECREF(mod_ctypes);
+		if (c_void_p == NULL) {
+			/* invalid or incomplete module */
+			return NULL;
+		}
+	}
+	return c_void_p;
+}
+
+static PyObject*
+as_ctypes_voidp(PyObject* self)
+{
+	PyObject* c_void_p;
+
+	if (PyObjCObject_GetObject(self) == nil) {
+		Py_INCREF(Py_None);
+		return Py_None;
+	}
+
+	c_void_p = get_c_void_p();
+	if (c_void_p == NULL) {
+		return NULL;
+	}
+
+	return PyObject_CallFunction(c_void_p, "k", (long)PyObjCObject_GetObject(self));
+}
+
+
+
 
 static PyMethodDef obj_methods[] = {
 	{
 		"Return a CObject representing this object"
 	},
 	{
+		"__c_void_p__",
+		(PyCFunction)as_ctypes_voidp,
+		METH_NOARGS,
+		"Return a ctypes.c_void_p representing this object"
+	},
+	{
 		NULL,
 		NULL,
 		0,

pyobjc-core/Modules/objc/pyobjc.h

  * Central include file for PyObjC. 
  */
 
-#define OBJC_VERSION "2.5.0b1"
+#define OBJC_VERSION "2.5"
 
 // Loading in AppKit on Mac OS X 10.3 results in
 // a bit less than 1500 classes.

pyobjc-core/NEWS.txt

 
 An overview of the relevant changes in new, and older, releases.
 
-Version 2.5b1
--------------
-
-.. note::
-
-   Version 2.5 is currently in development and hasn't been released
-   yet.
-
-- Issue #37: Fix runtime link error with EPD (Enthought Python Distribution),
-  which doesn't include the pymactoolbox functionality.
+Version 2.5
+-----------
+
+- Add conversion to/from ctypes.c_void_p to proxies for Cocoa objects.
+
+  To use::
+
+     anObject = NSArray.array()
+     void_p = anObject.__c_void_p__()
+     # use void_p with ctypes
+
+     otherObject = NSObject(c_void_p=voip_p)
+     assert anObject is otherObject
+
+  Note that it is save to contruct the python proxy from NSObject,
+  the class will return an instance of the correct proxy type (in this
+  example an instance of NSArray)
+
+- Fixed problem where the result of ``anObject.__cobject__()`` could not be converted
+  back to a PyObjC object again.
 
 - A number of framework wrappers have a "protocols" submodule containing
   protocol objects (for example the module 'Foundation.protocol'). Use
   documentation for the screen saver framework because the screen saver engine uses GC on 
   OSX 10.6 and 10.7.
 
+- Issue #37: Fix runtime link error with EPD (Enthought Python Distribution),
+  which doesn't include the pymactoolbox functionality.
+
+- Various improvements to the documentation
 
 Version 2.4.1
 -------------
 
+.. note:: 2.41 was never released, all bugfixes are in the 2.4 branch as well as the 2.5 release.
+
 - Cocoa wrappers: fix metadata for ``copy``, ``mutableCopy``, 
   ``copyWithZone:`` and ``mutableCopyWithZone:``
 

pyobjc-framework-Accounts/setup.py

 
 setup(
     name='pyobjc-framework-Accounts',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework Accounts on Mac OS X",
     packages = [ "Accounts" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     min_os_level="10.8",
 )

pyobjc-framework-AddressBook/setup.py

 
 setup(
     name='pyobjc-framework-AddressBook',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework AddressBook on Mac OS X",
     packages = [ "AddressBook" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-AppleScriptKit/setup.py

 
 setup(
     name='pyobjc-framework-AppleScriptKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework AppleScriptKit on Mac OS X",
     packages = [ "AppleScriptKit" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-AppleScriptObjC/setup.py

 setup(
     min_os_level='10.6',
     name='pyobjc-framework-AppleScriptObjC',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework AppleScriptObjC on Mac OS X",
     packages = [ "AppleScriptObjC" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-Automator/setup.py

 
 setup(
     name='pyobjc-framework-Automator',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework Automator on Mac OS X",
     packages = [ "Automator" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-CFNetwork/setup.py

 
 setup(
     name='pyobjc-framework-CFNetwork',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework CFNetwork on Mac OS X",
     packages = [ "CFNetwork" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     ext_modules = [
         Extension("CFNetwork._manual",

pyobjc-framework-CalendarStore/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-CalendarStore',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework CalendarStore on Mac OS X",
     packages = [ "CalendarStore" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-Cocoa/Examples/AppKit/CocoaBindings/CurrencyConvBinding/summary.txt

-A rewrite of `CurrencyConverter`__ using Cocoa Bindings.
-
-.. __: ../../CurrentConverter/index.html
+A rewrite of the :doc:`CurrencyConverter example </examples/Cocoa/AppKit/CurrencyConverter/index>` using Cocoa Bindings.
 
 Originally from `Introduction to Developing Cocoa Applications Using Bindings`, converted to PyObjC by u.fiedler.
 

pyobjc-framework-Cocoa/Examples/AppKit/CocoaBindings/TemperatureTransformer/summary.txt

 Based on `Apple's Value Transformers`__ documentation, converted to PyObjC 
 by u.fiedler.
 
-.. __: http://developer.apple.com/documentation/Cocoa/Conceptual/ValueTransformers/index.html
+.. __: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ValueTransformers/index.html

pyobjc-framework-Cocoa/Examples/AppKit/CurrencyConverter/00README.txt

 Currency Converter
 ==================
 
-:author: Ronald Oussoren
-:contact: ronaldoussoren@mac.com
-
-.. contents:
-
 Introduction
 ------------
 
-This is a port of the `Currency Converter`_ example from the Cocoa tutorial
+This is a port of the "Currency Converter" example from the Cocoa tutorial
 to Python (via PyObjC).  Development is done in "standalone" mode.  That is,
 the setup.py script is used to build an application wrapper that can be
 launched like any other Cocoa application.
 
 This will build the CurrencyConverter application in the directory *dist*
 within the current working directory as *CurrencyConverter.app*.
-
-.. _`Currency Converter`: file:///Developer/Documentation/Cocoa/ObjCTutorial/index.html 

pyobjc-framework-Cocoa/Examples/AppKit/CurrencyConverter/summary.txt

 A simple NIB based application. Start with this one. Also see the 
-`PyObjC tutorial`__.
-
-.. __: /documenation/tutorial/index.html
+:doc:`PyObjC tutorial </tutorials/index>`.

pyobjc-framework-Cocoa/Examples/AppKit/PackageManager/ReadMe.txt

 
 Run ``python setup.py py2app`` to create the application.
 
-.. _`MacPython wiki`: http://pythonmac.org/wiki
+.. _`MacPython wiki`: http://wiki.python.org/moin/MacPython

pyobjc-framework-Cocoa/Examples/AppKit/PyInterpreter/README.txt

 PyInterpreter is a full featured Python interpreter in a NSTextView.
 
 See:    http://pyobjc.sourceforge.net/
-        http://pythonmac.org/wiki/PyInterpreter
+        http://wiki.python.org/moin/MacPython/PyInterpreter
 
 Source for both the pyobjc module and PyInterpreter are
 available via the pyobjc sourceforge CVS repository.

pyobjc-framework-Cocoa/Modules/_AppKit_carbon.m

  * used in AppKit and wrapped in the python core).
  */
 
-#if PY_MAJOR_VERSION == 2
+#if PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 
 #ifndef __LP64__
 
 
 static int setup_carbon(PyObject* m __attribute__((__unused__)))
 {
-#if PY_MAJOR_VERSION == 2
+#if PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 	if (PyObjCPointerWrapper_Register(@encode(WindowRef),
 	                &window2py, &py2window) < 0)
 		return -1;

pyobjc-framework-Cocoa/Modules/_AppKit_nsquickdrawview.m

 
-#if !defined(__LP64__) && PY_MAJOR_VERSION == 2
+#if !defined(__LP64__) && PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 	/* Quickdraw only exists in 32-bit mode. We do define a dummy 
 	 * init function to avoid breaking the Python module.
 	 */
 
 static int setup_nsquickdrawview(PyObject* m __attribute__((__unused__)))
 {
-#if !defined(__LP64__) && PY_MAJOR_VERSION == 2
+#if !defined(__LP64__) && PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 	Class classNSQuickDrawView = objc_lookUpClass("NSQuickDrawView");
 	if (classNSQuickDrawView == NULL) {
 		return 0;

pyobjc-framework-Cocoa/Modules/_AppKit_nswindow.m

-#if PY_MAJOR_VERSION == 2
+#if PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 
-#ifdef __LP64__
+#ifdef __LP64__ 
 
 #include "pymactoolbox.h"
 
 static int setup_nswindows(PyObject* m __attribute__((__unused__)))
 {
 
-#if PY_MAJOR_VERSION == 2
+#if PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 	Class classNSWindow = objc_lookUpClass("NSWindow");
 	if (classNSWindow == NULL) {
 		return 0;

pyobjc-framework-Cocoa/Modules/_Foundation_typecode.m

  */
 /* inline definition of PyMac_GetOSType pymactoolbox.h doesn't work in 64-bit mode */
 
-#if PY_MAJOR_VERSION == 2
+#if PY_MAJOR_VERSION == 2 && defined(USE_TOOLBOX_OBJECT_GLUE)
 extern int PyMac_GetOSType(PyObject *v, OSType *pr);
 extern PyObject * PyMac_BuildOSType(OSType t);
 

pyobjc-framework-Cocoa/setup.py

 
 setup(
     name='pyobjc-framework-Cocoa',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the Cocoa frameworks on Mac OS X",
     packages = [ "Cocoa", "CoreFoundation", "Foundation", "AppKit", "PyObjCTools" ],
     namespace_packages = ['PyObjCTools'],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     ext_modules = [
         # CoreFoundation

pyobjc-framework-Collaboration/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-Collaboration',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework Collaboration on Mac OS X",
     packages = [ "Collaboration" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-CoreData/setup.py

 from pyobjc_setup import *
 setup(
     name='pyobjc-framework-CoreData',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework CoreData on Mac OS X",
     packages = [ "CoreData" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-CoreLocation/Examples/WhereIsMyMac/ReadMe.txt

 framework and is a translation in Python
 of the example at `"Cocoa with Love"`__
 
-.. __: http://cocoawithlove.com/2009/09/whereismymac-snow-leopard-corelocation.html
+.. __: http://www.cocoawithlove.com/2009/09/whereismymac-snow-leopard-corelocation.html
 

pyobjc-framework-CoreLocation/setup.py

 setup(
     min_os_level='10.6',
     name='pyobjc-framework-CoreLocation',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework CoreLocation on Mac OS X",
     packages = [ "CoreLocation" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-CoreText/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-CoreText',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework CoreText on Mac OS X",
     packages = [ "CoreText" ],
     ext_modules = [
             ),
     ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
-        'pyobjc-framework-Quartz>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
+        'pyobjc-framework-Quartz>=2.5',
     ],
 )

pyobjc-framework-DictionaryServices/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-DictionaryServices',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework DictionaryServices on Mac OS X",
     packages = [ "DictionaryServices" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-EventKit/setup.py

 
 setup(
     name='pyobjc-framework-EventKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework Accounts on Mac OS X",
     packages = [ "EventKit" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     min_os_level="10.8",
 )

pyobjc-framework-ExceptionHandling/setup.py

 
 setup(
     name='pyobjc-framework-ExceptionHandling',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework ExceptionHandling on Mac OS X",
     packages = [ "PyObjCTools", "ExceptionHandling" ],
     namespace_packages = [ "PyObjCTools" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-FSEvents/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-FSEvents',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework FSEvents on Mac OS X",
     packages = [ "FSEvents" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     ext_modules = [
         Extension("FSEvents._callbacks",

pyobjc-framework-InputMethodKit/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-InputMethodKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework InputMethodKit on Mac OS X",
     packages = [ "InputMethodKit" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-InstallerPlugins/Doc/api-notes-InstallerPlugins.txt

 ---------
 
 All API's in the InstallerPlugins framework are wrapped by PyObjC.
+
+.. warning::
+
+   I cannot find documentation for this framework on Apple's developer
+   website anymore, this likely means that this framework is on the
+   way out (even if it doesn't appear to be officially deprecated).

pyobjc-framework-InstallerPlugins/Examples/InstallerPluginSample/ReadMe.txt

 Lists web page <http://lists.apple.com/mailman/listinfo>.  Select the 
 "Installer-dev" list item and follow the steps on 
 "Subscribing to Installer-dev".
-	
-Documentation:	http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/index.html
+
+.. dead link:
+	Documentation:	http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/index.html

pyobjc-framework-InstallerPlugins/setup.py

 
 setup(
     name='pyobjc-framework-InstallerPlugins',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework InstallerPlugins on Mac OS X",
     packages = [ "InstallerPlugins" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-InstantMessage/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-InstantMessage',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework InstantMessage on Mac OS X",
     packages = [ "InstantMessage" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
-        'pyobjc-framework-Quartz>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
+        'pyobjc-framework-Quartz>=2.5',
     ],
 )

pyobjc-framework-InterfaceBuilderKit/setup.py

     min_os_level='10.5',
     max_os_level='10.6',
     name='pyobjc-framework-InterfaceBuilderKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework InterfaceBuilderKit on Mac OS X",
     packages = [ "InterfaceBuilderKit" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-LatentSemanticMapping/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-LatentSemanticMapping',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework LatentSemanticMapping on Mac OS X",
     packages = [ "LatentSemanticMapping" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-LaunchServices/setup.py

 
 setup(
     name='pyobjc-framework-LaunchServices',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework LaunchServices on Mac OS X",
     packages = [ "LaunchServices" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-Message/setup.py

 from pyobjc_setup import setup
 setup(
     name='pyobjc-framework-Message',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework Message on Mac OS X",
     packages = [ "Message" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-OpenDirectory/setup.py

 setup(
     min_os_level='10.6',
     name='pyobjc-framework-OpenDirectory',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework OpenDirectory on Mac OS X",
     packages = [ "OpenDirectory", "CFOpenDirectory" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-PreferencePanes/setup.py

 from pyobjc_setup import *
 setup(
     name='pyobjc-framework-PreferencePanes',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework PreferencePanes on Mac OS X",
     packages = [ "PreferencePanes" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-PubSub/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-PubSub',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework PubSub on Mac OS X",
     packages = [ "PubSub" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-QTKit/setup.py

 
 setup(
     name='pyobjc-framework-QTKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework QTKit on Mac OS X",
     packages = [ "QTKit" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
-        'pyobjc-framework-Quartz>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
+        'pyobjc-framework-Quartz>=2.5',
     ],
 )

pyobjc-framework-Quartz/setup.py

 
 setup(
     name='pyobjc-framework-Quartz',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the Quartz frameworks on Mac OS X",
     packages = [ "Quartz" ] + subpackages,
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     ext_modules = [
         # CoreVideo

pyobjc-framework-ScreenSaver/Examples/SillyBallsSaver/README.txt

     
 
 See:    http://www.epicware.com/macosxsavers.html
-        http://developer.apple.com/documentation/UserExperience/Reference/ScreenSaver/ObjC_classic/Classes/ScreenSaverView.html
-        http://www.cocoadev.com/index.pl?ScreenSaver
+        https://developer.apple.com/library/mac/#documentation/UserExperience/Reference/ScreenSaver/Classes/ScreenSaverView_Class/Reference/Reference.html
 
 The source of this application demonstrates
 - Writing a ScreenSaver in PyObjC

pyobjc-framework-ScreenSaver/setup.py

 
 setup(
     name='pyobjc-framework-ScreenSaver',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework ScreenSaver on Mac OS X",
     packages = [ "ScreenSaver" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     ext_modules = [
         Extension('ScreenSaver._inlines',

pyobjc-framework-ScriptingBridge/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-ScriptingBridge',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework ScriptingBridge on Mac OS X",
     packages = [ "ScriptingBridge" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-SearchKit/setup.py

 setup(
     min_os_level='10.5',
     name='pyobjc-framework-SearchKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework SearchKit on Mac OS X",
     packages = [ "SearchKit" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-ServerNotification/setup.py

 setup(
     min_os_level='10.6',
     name='pyobjc-framework-ServerNotification',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework ServerNotification on Mac OS X",
     packages = [ "ServerNotification" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-ServiceManagement/setup.py

 setup(
     min_os_level='10.6',
     name='pyobjc-framework-ServiceManagement',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework ServiceManagement on Mac OS X",
     packages = [ "ServiceManagement" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-Social/setup.py

 
 setup(
     name='pyobjc-framework-Social',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework Accounts on Mac OS X",
     packages = [ "Social" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     min_os_level="10.8",
 )

pyobjc-framework-SyncServices/setup.py

 
 setup(
     name='pyobjc-framework-SyncServices',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework SyncServices on Mac OS X",
     packages = [ "SyncServices" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
-        'pyobjc-framework-CoreData>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
+        'pyobjc-framework-CoreData>=2.5',
     ],
 )

pyobjc-framework-SystemConfiguration/setup.py

 
 setup(
     name='pyobjc-framework-SystemConfiguration',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework SystemConfiguration on Mac OS X",
     packages = [ "SystemConfiguration" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
     ext_modules = [
         Extension('SystemConfiguration._manual',

pyobjc-framework-WebKit/setup.py

 
 setup(
     name='pyobjc-framework-WebKit',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework WebKit on Mac OS X",
     packages = [ "WebKit", "JavaScriptCore" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )

pyobjc-framework-XgridFoundation/setup.py

 setup(
     max_os_level='10.7',
     name='pyobjc-framework-XgridFoundation',
-    version="2.5.0b1",
+    version="2.5",
     description = "Wrappers for the framework XgridFoundation on Mac OS X",
     packages = [ "XgridFoundation" ],
     setup_requires = [
-        'pyobjc-core>=2.5.0b1',
+        'pyobjc-core>=2.5',
     ],
     install_requires = [
-        'pyobjc-core>=2.5.0b1',
-        'pyobjc-framework-Cocoa>=2.5.0b1',
+        'pyobjc-core>=2.5',
+        'pyobjc-framework-Cocoa>=2.5',
     ],
 )
 
 import os
 
-VERSION="2.5.0b1"
+VERSION="2.5"
 
 # Note 1: the requires list is split into a number
 # of lists because not all framework wrappers can