Author: ronaldoussoren
Date: Mon Apr 13 03:32:15 2009
New Revision: 2156
Log:
* Complete unittests
* Example actually works now
* Fix small issues with metadata and manual wrapper
* Update version to 2.2b2
Removed:
trunk/pyobjc/pyobjc-framework-FSEvents/README.txt
Modified:
trunk/pyobjc/pyobjc-framework-FSEvents/Examples/watcher.py
trunk/pyobjc/pyobjc-framework-FSEvents/Lib/FSEvents/PyObjC.bridgesupport
trunk/pyobjc/pyobjc-framework-FSEvents/Modules/_callbacks.m
trunk/pyobjc/pyobjc-framework-FSEvents/PyObjCTest/test_fsevents.py
trunk/pyobjc/pyobjc-framework-FSEvents/setup.py
Modified: trunk/pyobjc/pyobjc-framework-FSEvents/Examples/watcher.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-FSEvents/Examples/watcher.py (original)
+++ trunk/pyobjc/pyobjc-framework-FSEvents/Examples/watcher.py Mon Apr 13 03:32:15 2009
@@ -3,6 +3,7 @@
import sys
import os
import stat
+import errno
def T_or_F(x):
if x:
@@ -131,7 +132,7 @@
settings.debug("FSEventStreamFlushAsync(streamRef = %s)", streamRef)
FSEventStreamFlushAsync(streamRef)
-def fsevents_callback(streamRef, clientInfo, numEvents, eventPaths, eventMarsks, eventIDs):
+def fsevents_callback(streamRef, clientInfo, numEvents, eventPaths, eventMasks, eventIDs):
settings.debug("fsevents_callback(streamRef = %s, clientInfo = %s, numEvents = %s)", streamRef, clientInfo, numEvents)
settings.debug("fsevents_callback: FSEventStreamGetLatestEventId(streamRef) => %s", FSEventStreamGetLatestEventId(streamRef))
full_path = clientInfo
@@ -164,7 +165,7 @@
print "Could not update size on %s"%(path,)
else:
- print "New total size: %d (change made to %s) for path: %s"(
+ print "New total size: %d (change made to %s) for path: %s"%(
get_total_size(), path, full_path)
@@ -265,7 +266,8 @@
try:
names = os.listdir(dirname)
except os.error, msg:
- if msg.errno == errno.ENOENT:
+ print msg.errno, errno.EPERM
+ if msg.errno in (errno.ENOENT, errno.EPERM, errno.EACCES):
del dir_items[dirname]
return 0
Modified: trunk/pyobjc/pyobjc-framework-FSEvents/Lib/FSEvents/PyObjC.bridgesupport
==============================================================================
--- trunk/pyobjc/pyobjc-framework-FSEvents/Lib/FSEvents/PyObjC.bridgesupport (original)
+++ trunk/pyobjc/pyobjc-framework-FSEvents/Lib/FSEvents/PyObjC.bridgesupport Mon Apr 13 03:32:15 2009
@@ -22,7 +22,7 @@
<arg type='^{__FSEventStream=}' />
</function>
<function name='FSEventStreamCopyPathsBeingWatched'>
- <retval type='^{__CFArray=}' />
+ <retval type='^{__CFArray=}' already_cfretained='true' />
<arg type='^{__FSEventStream=}' />
</function>
<function name='FSEventStreamCreate'>
@@ -47,7 +47,7 @@
<arg type='L' />
</function>
<function name='FSEventStreamFlushAsync'>
- <retval type='v' />
+ <retval type='q' />
<arg type='^{__FSEventStream=}' />
</function>
<function name='FSEventStreamFlushSync'>
Modified: trunk/pyobjc/pyobjc-framework-FSEvents/Modules/_callbacks.m
==============================================================================
--- trunk/pyobjc/pyobjc-framework-FSEvents/Modules/_callbacks.m (original)
+++ trunk/pyobjc/pyobjc-framework-FSEvents/Modules/_callbacks.m Mon Apr 13 03:32:15 2009
@@ -268,7 +268,7 @@
PyObject* py_flags;
PyObject* py_deviceToWatch;
- if (!PyArg_ParseTuple(args, "OOOOOOO",
+ if (!PyArg_ParseTuple(args, "OOOOOOOO",
&py_allocator, &py_callback, &py_callback_info,
&py_deviceToWatch, &py_pathsToWatch, &py_sinceWhen,
&py_latency, &py_flags)) {
Modified: trunk/pyobjc/pyobjc-framework-FSEvents/PyObjCTest/test_fsevents.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-FSEvents/PyObjCTest/test_fsevents.py (original)
+++ trunk/pyobjc/pyobjc-framework-FSEvents/PyObjCTest/test_fsevents.py Mon Apr 13 03:32:15 2009
@@ -4,6 +4,7 @@
import FSEvents
from FSEvents import *
from PyObjCTools.TestSupport import *
+import os, time
class TestFSEvents (TestCase):
@@ -34,35 +35,91 @@
def testFunctions(self):
+ def fsevents_callback(streamRef, clientInfo, numEvents, eventPaths, eventMarsks, eventIDs):
+ pass
+ context = object()
+
+ ref = FSEventStreamCreate(None, fsevents_callback, context,
+ ["/etc", "/tmp"], kFSEventStreamEventIdSinceNow, 2.0, kFSEventStreamCreateFlagUseCFTypes|kFSEventStreamCreateFlagNoDefer)
+
+ self.failUnlessIsInstance(ref, FSEventStreamRef)
+ FSEventStreamRelease(ref); ref = None
+
+ ref = FSEventStreamCreateRelativeToDevice(
+ None, fsevents_callback, context,
+ os.stat('/').st_dev, ["/etc", "/tmp"], kFSEventStreamEventIdSinceNow, 2.0, kFSEventStreamCreateFlagUseCFTypes|kFSEventStreamCreateFlagNoDefer)
+ self.failUnlessIsInstance(ref, FSEventStreamRef)
+ try:
+ v = FSEventStreamGetLatestEventId(ref)
+ self.failUnlessIsInstance(v, (int, long))
+
+ v = FSEventStreamGetDeviceBeingWatched(ref)
+ self.failUnlessIsInstance(v, (int, long))
+
+ self.failUnlessResultIsCFRetained(FSEventStreamCopyPathsBeingWatched)
+ v = FSEventStreamCopyPathsBeingWatched(ref)
+ self.failUnlessIsInstance(v, CFArrayRef)
+ self.failUnlessEqual(len(v), 2)
+ self.failUnlessEqual(v, ["/etc", "/tmp"])
+
+ v = FSEventsGetCurrentEventId()
+ self.failUnlessIsInstance(v, (int, long))
+
+ v = FSEventsCopyUUIDForDevice(os.stat('/').st_dev)
+ self.failUnlessIsInstance(v, CFUUIDRef)
+
+ v = FSEventsGetLastEventIdForDeviceBeforeTime(os.stat('/').st_dev, time.time()-(3600*25))
+ self.failUnlessIsInstance(v, (int, long))
+
+ # Calling this function can affect the actual device (when running
+ # the tests as root), therefore test against /dev which is a virtual
+ # filesystem on OSX
+ self.failUnlessResultIsBOOL(FSEventsPurgeEventsForDeviceUpToEventId)
+ v = FSEventsPurgeEventsForDeviceUpToEventId(os.stat('/dev').st_dev,
+ FSEventsGetLastEventIdForDeviceBeforeTime(os.stat('/dev').st_dev, 0))
+ self.failUnlessIsInstance(v, bool)
+
+ FSEventStreamRetain(ref)
+ FSEventStreamRelease(ref)
+
+ rl = CFRunLoopGetCurrent()
+ FSEventStreamScheduleWithRunLoop(ref, rl, kCFRunLoopDefaultMode)
+
+
+ self.failUnlessResultIsBOOL(FSEventStreamStart)
+ FSEventStreamStart(ref)
+
+ v = FSEventStreamFlushAsync(ref)
+ self.failUnlessIsInstance(v, (int, long))
+
+ FSEventStreamFlushSync(ref)
+ FSEventStreamStop(ref)
+
+ FSEventStreamUnscheduleFromRunLoop(ref, rl, FSEventStreamUnscheduleFromRunLoop)
+
+ fd = os.dup(2)
+ fd2 = os.open('/dev/null', os.O_WRONLY)
+ os.dup2(fd2, 2)
+ os.close(fd2)
+ try:
+ FSEventStreamShow(ref)
+
+ finally:
+ os.dup2(fd, 2)
+
+ v = FSEventStreamCopyDescription(ref)
+ self.failUnlessIsInstance(v, unicode)
+
+ FSEventStreamInvalidate(ref)
+
+ finally:
+ FSEventStreamRelease(ref); ref = None
- self.assert_( hasattr(FSEvents, 'FSEventStreamCreateRelativeToDevice') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamCreateRelativeToDevice') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamGetLatestEventId') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamGetDeviceBeingWatched') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamCopyPathsBeingWatched') )
- self.assert_( hasattr(FSEvents, 'FSEventsGetCurrentEventId') )
- self.assert_( hasattr(FSEvents, 'FSEventsCopyUUIDForDevice') )
- self.assert_( hasattr(FSEvents, 'FSEventsGetLastEventIdForDeviceBeforeTime') )
- self.assert_( hasattr(FSEvents, 'FSEventsPurgeEventsForDeviceUpToEventId') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamRetain') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamRelease') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamScheduleWithRunLoop') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamUnscheduleFromRunLoop') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamInvalidate') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamStart') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamFlushAsync') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamFlushSync') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamStop') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamShow') )
- self.assert_( hasattr(FSEvents, 'FSEventStreamCopyDescription') )
def testOpaque(self):
self.assert_( hasattr(FSEvents, 'FSEventStreamRef') )
self.failUnlessIsOpaquePointer(FSEventStreamRef)
- def testIncomplete(self):
- self.fail("Add proper tests for FSEvents functions")
-
if __name__ == "__main__":
main()
Modified: trunk/pyobjc/pyobjc-framework-FSEvents/setup.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-FSEvents/setup.py (original)
+++ trunk/pyobjc/pyobjc-framework-FSEvents/setup.py Mon Apr 13 03:32:15 2009
@@ -1,5 +1,7 @@
'''
-Wrappers for framework 'FSEvents'.
+Wrappers for the "FSEvents" API in MacOS X. The functions in this framework
+allow you to reliably observe changes to the filesystem, even when your
+program is not running al the time.
These wrappers don't include documentation, please check Apple's documention
for information on how to use this framework and PyObjC's documentation
@@ -18,7 +20,7 @@
setup(
name='pyobjc-framework-FSEvents',
- version='2.2b1',
+ version='2.2b2',
description = "Wrappers for the framework FSEvents on Mac OS X",
long_description = __doc__,
author='Ronald Oussoren',
------------------------------------------------------------------------------
This SF.net email is sponsored by:
High Quality Requirements in a Collaborative Environment.
Download a free trial of Rational Requirements Composer Now!
http://p.sf.net/sfu/www-ibm-com
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.