Hi,
I'm happy to announce release 0.70.1 of Task Coach. This release
optionally brings back the tabbed user interface that was removed in the
previous release and fixes a few bugs.
Bugs fixed:
* The search control in the toolbar did not maintain state correctly for
different viewers. Task Coach viewers now each have their own toolbar
with search control.
* Marking tasks completed or changing their priority would change the
selection.
* On Max OS X, put preferences menu item in the TaskCoach menu instead of the
Edit menu to conform with Mac OS X standards.
* Focus issues: On Mac OS X, text couldn't be edited while the timer was
running. On Windows, notifications from other programs overlapping with the
main window would take away focus from dialogs.
* Prevent crash under Windows XP when dropping e-mail from Thunderbird if the
APPDATA environment variable is not defined.
* ImportError: No module named thirdparty.ElementTree. This exception would
happen when using a source distribution of Task Coach or a package (rpm, deb)
for Linux *and* when the default version of Python on the system is Python 2.4.
Task Coach tried to import a module from the wrong package.
* On Linux, when using a dark theme, use appropriate background colors for the
category viewer and the text color buttons in the preferences dialog.
* Remember whether the main window was maximized and if so, maximize the main
window when starting the next time.
* Correctly sort tasks on startup when sort column is 'Overall categories'.
* Correctly redraw toolbar when it is 'damaged' by other windows.
* Correctly sort effort for subtasks in effort per day, per week, and per
month effort viewers.
* Better navigation with tab key in dialogs.
* Keep newlines in descriptions when printing or exporting to HTML.
Feature added:
* Task Coach can now use either the old tabbed user interface (whose layout
still cannot be saved, by the way) or the 'managed frame' interface introduced
in release 0.70.0. This can be changed in the Preferences dialog.
What is Task Coach?
Task Coach is a simple task manager that allows for hierarchical tasks, i.e.
tasks in tasks. Task Coach is open source (GPL) and is developed using Python
and wxPython. You can download Task Coach from:
http://www.taskcoach.org
In addition to the source distribution, packaged distributions are available
for Windows XP/Vista, Mac OS X, and Linux (Debian and RPM format).
Note that Task Coach is alpha software, meaning that it is wise to back up
your task file regularly, and especially when upgrading to a new release.
Cheers, Frank
If you're going to OSCON and haven't yet registered, you may use the
following code to receive a 15% discount:
os08pgm
OSCON will be in Portland, Oregon 7/21-25. For more info:
http://conferences.oreilly.com/oscon
--
Aahz (aahz(a)pythoncraft.com) <*> http://www.pythoncraft.com/
"as long as we like the same operating system, things are cool." --piranha
A new version of ConfigObj is now available, version 4.5.3.
This version is a minor bugfix release. It fixes a relatively obscure
bug, where an exception could be raised when validating a config file
with 'copy=True' and '__many__' sections.
* Home Page: http://www.voidspace.org.uk/python/configobj.html
* Download: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.5…
ConfigObj is a Python module for the simple reading and writing of
config files. It has many features, whilst remaining easy to use.
With the assistance of validate it can validate a config file against
a specification, and convert members to the expected type.
Eggs for Python 2.4 & 2.5 are available from Python Package Index.
Greetings,
The SciPy Conference is not too far away. I thought I'd summarize
some recent news about the conference in case some of you missed it:
- Accommodations (news!): We've negotiated a group rate with a nearby
Marriott hotel, for those that would like to take advantage of it.
The hotel has set up a web site for our event here:
http://cwp.marriott.com/laxot/scipyworkshop/
- Student Sponsorship: As you may have seen, the Python Software
Foundation has agreed to partner with Enthought to sponsor 10
students' travel, registration, and accommodation for the tutorials,
conference and (most importantly) sprints. If you're in college or a
graduate program, please check out the details here:
http://conference.scipy.org/sponsoring
- Abstracts Submission Deadline Extended: The review committee is
extending the deadline to Monday, June 30th. Please see the Call for
Papers for instructions on abstract submission here:
http://conference.scipy.org/call_for_papers
Please drop me an email if you have any questions or comments.
Best,
Travis
Short list of changes
* Python2.1 support was dropped, as are Netscape0.4 compromises in the
HTML writer.
* Enhanced citation support and literal-block parametrization for
LaTeX2e writer.
* The PEP writer supports new python.org website structure
and pep2pyramid.py.
* New OO API for directives. Hebrew (and possibly
other language) mappings. Configuration files are now assumed and required to be
UTF-8-encoded. Some templates and enhanced emacs support.
download: http://prdownloads.sourceforge.net/docutils/docutils-0.5.tar.gz?download
Changelog: http://docutils.sourceforge.net/0.5/HISTORY.html
--
pg/python release
=================
Date
``Sun Jun 22 15:57:42 MST 2008``
Summary
``Bug Fixes``
Changes
-------
pg_proboscis-1.0.2:
- Fix cursor-identifier based ``cursor`` creation.
- Fix DB-API 2.0 connect() showstopper. (sigh)
- Detect errno.ECONNRESET and properly mark the connection as 'LOST'
(By not doing so, a superfluous exception would get thrown on
close())
pg_pqueue-1.0.1:
- Correct the signed-ness of tuple descriptor attributes.
- Fix Describe(Portal) message handling.
About
=====
http://python.projects.postgresql.org/?utm_source=release&utm_medium=email&…
pg/python is a project dedicated to improving the Python interfaces to
PostgreSQL. pg/python is not a monolithic project. It isolates
components
to encourage targeted packaging and reusability without unwanted side-
code.
Projects
--------
pg_proboscis
The programmer's client providing both DB-API 2.0 and GreenTrunk
interfaces.
pg_teop
The procedural language. ("PL/Py", In development)
pg_foundation
Basics. Exception hierarchy, optparse options, SQL string splitter,
types,
and much more.
pg_typical
Binary type I/O routines. Arrays, composite types, geo-types,
primitives.
Uses pg_foundation's ``postgresql.types`` to instantiate some types.
pg_pqueue
PQ protocol basics. What pg_proboscis uses to do PQ 3.0.
pg_greentrunk
The GreenTrunk APIs are specified in a module herein.
pg_boss
PostgreSQL cluster management. (In development)
pg_tin
Cluster management for developer testing. (In development)
Driver Overview
---------------
pg_proboscis is a Python programmer's client for PostgreSQL(driver/
interface).
It distinguishes itself from other drivers by the following:
- BSD/MIT licensed (from some drivers ;)
- Pure-Python (Optional C-extension for reading wire messages)
- Binary type transmission (no need to escape bytea, for instance)
- Protocol level prepared statements (parameter types are dictated by
the server)
- Protocol level cursors (You can even open cursors created on the
server via GT)
Allows results to be streamed in.
- Alternate database APIs (GreenTrunk, for those that aren't fond of
DB-API 2.0)
- Composite type support
- Structured Arrays (including arrays of composite types for some
versions of PG)
- COPY interfaces that work with arbitrary iterators (See examples
further down)
- with_statement support for managing transactions, savepoints, and
setting contexts
- executemany()/query.load() takes advantage of PQ 3.0's extended
protocol
- So many unittests. Really. And more to come.
- Obsessive dedication to creating *great* software.
The GreenTrunk API is defined using the
``postgresql.protocol.greentrunk.api`` module.
Getting help() on this module or using the included ``pg_greentrunk``
console script
yields reference material for using GreenTrunk connections. However,
pg_proboscis is
not exclusively GreenTrunk, it includes a DB-API 2.0 compliant module
as well.
[('pyformat' paramstyle) postgresql.interface.proboscis.dbapi2]
Downloading
===========
It is suggested to just use easy_install::
$ python -m easy_install pg_proboscis
$ python -m easy_install <project name>
If that is not desireable, you'll have to download the files from:
http://python.projects.postgresql.org/files/
Note: It is unlikely that pg_teop will be ever be installable via
easy_install.
Documentation
=============
The places you will likely want to visit:
http://python.projects.postgresql.org/doc/pg_proboscis-1.0.html?utm_source=…
(How to make a connection, and the pb_python command)
http://python.projects.postgresql.org/doc/pg_greentrunk-1.0.html?utm_source…
(Connection APIs)
http://python.projects.postgresql.org/doc/pg_foundation-1.0.html?utm_source…
(optparse options, pgpass parser, all sorts of things postgres)
GreenTrunk Examples
===================
The use of the '~'-operation is exhibited quite freely here. When
invoked,
query objects return a cursor object, so in order to provide more
convenient
access to simple data, the '~' can be used to quickly get the first
column of
the first row of a single-column result set.
``gtx`` is the connection object. These examples come from a
``pb_python`` run.
``pb_python`` is a console script that establishes a connection, binds
it to the
``__builtins__`` module as ``gtx``, and then runs the "python
command"(provides a
Python command with a database connection; ie, interactive console if
no script
is given).
Protocol Level Prepared Statements by Default
---------------------------------------------
::
# Create a prepared statement.
>>> q = gtx.query('select * from pg_type where typname = $1')
>>> q
<postgresql.interface.proboscis.tracenull.ClientPreparedStatement[pq://
jwp@localhost:5432]>
>>> dir(q)
['__call__', '__class__', '__del__', '__delattr__', '__dict__',
'__doc__', '__getattribute__', '__hash__', '__init__', '__invert__',
'__iter__', '__lshift__', '__module__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__',
'_input_io', '_output_attmap', '_output_io', '_rformats', 'close',
'closed', 'connection', 'defaults', 'finish', 'first', 'input',
'load', 'output', 'portal', 'prepare', 'prime', 'reprepare',
'statement_id', 'string', 'title']
# Bind a cursor. (typname = 'text')
>>> r = q('text')
>>> r
<postgresql.interface.proboscis.tracenull.ClientStatementCursor
object at 0x2861790c>
>>> r.query
<postgresql.interface.proboscis.tracenull.ClientPreparedStatement[pq://
jwp@localhost:5432]>
>>> dir(r)
['__class__', '__del__', '__delattr__', '__dict__', '__doc__',
'__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__',
'__module__', '__new__', '__next__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__str__', '__weakref__', '_contract',
'_expand', '_mktuple', '_output_attmap', '_output_io', '_rformats',
'_state', '_xp_fetchmore', '_xp_move', 'close', 'closed',
'connection', 'fetchcount', 'move', 'next', 'output', 'portal_id',
'query', 'read', 'scroll', 'seek', 'whence_map']
# Grab a row.
>>> row1 = r.next()
>>> row1
(u'text', 11, 10, -1, False, 'b', True, ',', 0, 0, 1009, u'textin',
u'textout', u'textrecv', u'textsend', u'-', u'-', u'-', 'i', 'x',
False, 0, -1, 0, None, None)
>>> row1.keys()
['typmodin', 'typnamespace', 'typbyval', 'typsend', 'typdelim',
'typnotnull', 'typndims', 'typinput', 'typtypmod', 'typarray',
'typdefault', 'typdefaultbin', 'typtype', 'typisdefined', 'typlen',
'typelem', 'typrelid', 'typreceive', 'typbasetype', 'typalign',
'typname', 'typstorage', 'typanalyze', 'typmodout', 'typowner',
'typoutput']
>>> row1['typlen']
-1
Primitive Types
---------------
::
>>> q=gtx.query('select $1::bytea, $2::int, $3::bigint, $4::text')
>>> r=q('\x00\x01', 123, 2**34, u'ƒoobar').next()
>>> r
('\x00\x01', 123, 17179869184L, u'\u0192oobar')
Arrays
------
::
>>> ~gtx.query("select ARRAY[1::int, 2, 3, 256]")
postgresql.types.array([1, 2, 3, 256])
>>> a=~gtx.query("select ARRAY[1::int, 2, 3, 256]")
>>> a[0]
1
>>> a[-1]
256
>>> for x in a:
... print x
...
1
2
3
256
>>>
Composite Types
---------------
::
>>> gtx.execute('create type test as (i int, t text)')
>>> cto = ~gtx.query("select (123, 'foo')::test")
>>> cto
(123, u'foo')
>>> cto['t']
u'foo'
>>> cto[-1]
u'foo'
>>> for x in cto:
... print x
...
123
foo
COPY TO STDOUT
--------------
::
>>> copy=gtx.query('copy (select i from generate_series(1,10) g(i))
to stdout')()
>>> copy
<postgresql.interface.proboscis.tracenull.ResultHandle object at
0x2874dc6c>
>>> copy.next()
'1\n'
>>> copy.next()
'2\n'
>>> copy.read(10)
['3\n', '4\n', '5\n', '6\n', '7\n', '8\n', '9\n', '10\n']
COPY FROM STDIN
---------------
::
>>> gtx.execute('create temp table t (i int, t text)')
>>> copy_t = gtx.query('copy t from stdin')
>>> copy_t(['%d\t%s\n'%(x,str(x) + 'text') for x in xrange(1, 100)])
<postgresql.interface.proboscis.tracenull.ResultHandle object at
0x28617d0c>
>>> ~gtx.query('select count(*) FROM t')
99
>>> for i, t in gtx.query('select * from t where random() < 0.1'):
... print i, t
...
8 8text
9 9text
16 16text
17 17text
27 27text
48 48text
50 50text
62 62text
73 73text
76 76text
Incremental COPY FROM STDIN
---------------------------
::
>>> gtx.execute('create temp table t (i int, t text)')
>>> copy_t = gtx.query('copy t from stdin')
>>> ict = copy_t()
>>> ict
<postgresql.interface.proboscis.tracenull.ResultHandle object at
0x28617dac>
>>> dir(ict)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__',
'__getattribute__', '__hash__', '__init__', '__iter__', '__module__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__str__', '__weakref__', '_contract', '_discover_type', '_expand',
'_expect_types', '_lastcopy', '_result_types', 'close', 'closed',
'command', 'complete', 'connection', 'count', 'next', 'query', 'read',
'type', 'write', 'xact']
>>> ict.write('3\tjust text\n')
>>> ict.close()
>>> ~gtx.query("select * from t where t.t = 'just text'")
(3, u'just text')
# Again, but use the faster __call__ interface that works on an
iterator.
>>> ict = copy_t()
>>> ict(['3\ttext and %d\n' %(x,) for x in xrange(10)])
>>> ict.close()
>>> ~gtx.query("select count(*) from t where t.t ~ 'text and '")
10
Transactions
------------
::
# Error Recovery
>>> with gtx.xact:
... gtx.execute('selekt 1')
...
Traceback (most recent call last):
File "<console>", line 2, in <module>
File "build/bdist.freebsd-7.0-RELEASE-i386/egg/postgresql/interface/
proboscis/tracenull.py", line 1845, in execute
self._complete()
File "build/bdist.freebsd-7.0-RELEASE-i386/egg/postgresql/interface/
proboscis/tracenull.py", line 2378, in _complete
self._pop()
File "build/bdist.freebsd-7.0-RELEASE-i386/egg/postgresql/interface/
proboscis/tracenull.py", line 2408, in _pop
raise xact_error
SyntaxError: syntax error at or near "selekt"
CODE: 42601
POSITION: 1
LOCATION: File 'scan.l', line 807, in base_yyerror
>>> gtx.xact.failed
>>> gtx.state
'I'
# State difference
>>> with gtx.xact:
... try:
... gtx.execute('selekt 1')
... except:
... print 'state: ', gtx.state
... print 'failed: ', str(gtx.xact.failed)
...
state: E
failed: True
>>> gtx.state
'I'
# Transaction manager details
>>> import sys
>>> gtx.tracer = sys.stderr.write
>>> with gtx.xact:
... with gtx.xact:
... gtx.execute('select 1')
...
↑ 'Q'(18): 'START TRANSACTION\x00'
↓ 'C'(18): 'START TRANSACTION\x00'
↓ 'Z'(1): 'T'
↑ 'Q'(20): 'SAVEPOINT "xact(1)"\x00'
↓ 'C'(10): 'SAVEPOINT\x00'
↓ 'Z'(1): 'T'
↑ 'Q'(9): 'select 1\x00'
↓ 'T'(29): '\x00\x01?column?
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x04\xff\xff\xff\xff
\x00\x00'
↓ 'D'(7): '\x00\x01\x00\x00\x00\x011'
↓ 'C'(7): 'SELECT\x00'
↓ 'Z'(1): 'T'
↑ 'Q'(18): 'RELEASE "xact(1)"\x00'
↓ 'C'(8): 'RELEASE\x00'
↓ 'Z'(1): 'T'
↑ 'Q'(7): 'COMMIT\x00'
↓ 'C'(7): 'COMMIT\x00'
↓ 'Z'(1): 'I'
>>> del gtx.tracer
Announcing
----------
The 2.8.8.0 release of wxPython is now available for download at
http://wxpython.org/download.php. This release has had a number of
further refinements and enhancements on the stable 2.8 source tree
since the previous release. On Mac OS X 10.5 (Leopard) the Python
2.5 binaries of wxPython are able to be used with either Apple's
system Python, or with the Python.org version.
Source code is available, as well as binaries for Python 2.3, 2.4 and
2.5, for Windows and Mac, as well some packages for various Linux
distributions. A summary of changes is listed below and also at
http://wxpython.org/recentchanges.php.
What is wxPython?
-----------------
wxPython is a GUI toolkit for the Python programming language. It
allows Python programmers to create programs with a robust, highly
functional graphical user interface, simply and easily. It is
implemented as a Python extension module that wraps the GUI components
of the popular wxWidgets cross platform library, which is written in
C++.
wxPython is a cross-platform toolkit. This means that the same program
will usually run on multiple platforms without modifications.
Currently supported platforms are 32-bit Microsoft Windows, most Linux
or other Unix-like systems using GTK2, and Mac OS X 10.3+, in most
cases the native widgets are used on each platform to provide a 100%
native look and feel for the application.
Changes in 2.8.8.0
------------------
Added the PlateButton class from Cody Precord.
Added wx.PyEvtHandler, which supports overriding the ProcessEvent
method in derived classes. Instances of this class can be pushed onto
the event handler chain of a window in order to hook into the event
processing algorithm, and its ProcessEvent method will be called for
every event sent to the window.
With much help from Anthony Tuininga the code generated by the img2py
tool is now cleaner, simpler and smaller. Instead of writing the data
for the images as printable ascii with hex escapes it now uses base64
to encode the images into a string. In addition, instead of top-level
functions for returning the image data and bitmaps, the embedded
images now use a simple class with methods for returning the image as
a bitmap, icon, or etc. By default in 2.8.x top-level aliases will be
generated to make the code backward compatible with the old functional
interface, but you can use -F to turn that off. In 2.9 and beyond the
default will be to generate only the new class interface, but -f can
be used to turn the old behavior back on.
The PyEmbeddedImage class added for the new img2py support can also be
used for image data that may be acquired from some other source at
runtime, such as over the network or from a database. In this case
pass False for isBase64 (unless the data actually is base64 encoded.)
Any image type that wx.ImageFromStream can handle should be okay. See
the wx.lib.embeddedimage module for details.
Exposed the wx.GenericDatePickerCtrl to wxPython. On wxGTK and wxMac
this is exactly the same as the normal date picker, but on wxMSW it
allows you to avoid the native wx.DatePickerCtrl if so desired. Also
fixed a bug that caused an assert if you tried to set the date to
wx.DefaultDateTime even if wx.DP_ALLOWNONE was specified.
Made a little hack in wx.lib.masked.TextCtrl that allows it to be
wrapped around an already existing TextCtrl instead of always creating
its own. This is useful for example with the wx.TextCtrl that is
built-in to the customizable wx.combo.ComboCtrl, or with a textctrl
that is part of an XRC layout. To use it you need to do a little
trick like this::
existingTextCtrl = combo.GetTextCtrl()
maskedCtrl = wx.lib.masked.TextCtrl.__new__(wx.lib.masked.TextCtrl)
maskedCtrl.this = existingTextCtrl.this
maskedCtrl.__init__(parent)
Enhanced the Widget Inspection Tool with some new functionality.
Added tools to the toolbar to expand and collapse the widget tree,
which is very helpful for not getting lost in very large applications
with many hundreds of widgets. Also added a toolbar tool for
highlighting the currently selected widget or sizer in the live
application. The tool will flash top-level windows and for all other
items it will draw an outline around the item for a few seconds.
Copied the sized_controls module to the wx.lib package as the first
step of phasing out the wxaddons package.
Added an implementation of wx.Window.SetDoubleBuffered on Windows.
(GTK already has one, and Mac doesn't need one because everything is
always double buffered by the system there.)
Added a wrapper to wx.TopLevelWindow for MacGetTopLevelWindowRef to
facilitate calling the Carbon APIs directly for things that are not
supported in wx, similar to how we can use ctypes or PyWin32 with
window.GetHandle() to do custom stuff on Windows. (On wxMac GetHandle
returns the ControlRef, which is different than the WindowRef, hence
the need for a 2nd method.) Here is an example to set the modified
flag in the caption::
>>> import ctypes
>>> carbon = ctypes.CDLL('/System/Library/Carbon.framework/Carbon')
>>> carbon.SetWindowModified(frame.MacGetTopLevelWindowRef(), True)
Added a new light-weight solution for embedding ActiveX controls in
wxPython applications that uses ctypes and the comtypes package
available from http://starship.python.net/crew/theller/comtypes/.
Comtypes allows us to use and provide an interface with full dynamic
dispatch abilities, much like PyWin32's COM interfaces but with much
reduced external dependencies. See wx/lib/activex.py for more
details. IMPORTANT: Be sure to get at least version 0.5 of comtypes,
see the docstring in the wx.lib.activex module for details.
The wx.lib.iewin, wx.lib.pdfwin, and wx.lib.flashwin modules were
switched to use the new and improved activex module. The APIs
provided by these modules should be mostly compatible with what was
there before, except for how the COM events are handled. Instead of
sending wx events it relies on you overriding methods with the same
names as the COM events. You can either do it in a or derived class,
or you can set an instance of some other class to be the event sink.
See the ActiveX_IEHtmlWindow sample in the demo for an example. If you
would rather continue to use the old version of these modules they are
available in the wx.lib with "_old" added to the names.
Added the wx.lib.resizewidget module. This module provides the
ResizeWidget class, which reparents a given widget into a specialized
panel that provides a resize handle for the widget. When the user
drags the resize handle the widget is resized accordingly, and an
event is sent to notify parents that they should recalculate their
layout.
--
Robin Dunn
Software Craftsman
http://wxPython.org Java give you jitters? Relax with wxPython!