279 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
==============================================
 | 
						|
Why, who, what and how do you do *the py lib*? 
 | 
						|
==============================================
 | 
						|
 | 
						|
.. contents::
 | 
						|
.. sectnum::
 | 
						|
 | 
						|
 | 
						|
Why did we start the py lib? 
 | 
						|
============================
 | 
						|
 | 
						|
.. _frustrations: 
 | 
						|
 | 
						|
Frustrations and the fun of developing new ways 
 | 
						|
-----------------------------------------------
 | 
						|
 | 
						|
Among the main motivations for writing the py lib is
 | 
						|
frustration at existing python modules and packages, 
 | 
						|
among them: 
 | 
						|
 | 
						|
- there is no standard way of testing python applications, 
 | 
						|
  scripts or modules.  everybody does its own hack around 
 | 
						|
  the unittest.py if testing happens at all. 
 | 
						|
 | 
						|
- due to python's default *export all names* policy for modules
 | 
						|
  and packages it is hard to refactor code across 
 | 
						|
  releases because you might break usages of your code 
 | 
						|
 | 
						|
- the python "batteries included" standard modules are tied to 
 | 
						|
  the python release process.  You can't easily benefit from 
 | 
						|
  new python module in older python versions which you might 
 | 
						|
  have to use for whatever reason. 
 | 
						|
 | 
						|
- support for richer interactive interaction with command line 
 | 
						|
  utilities or e.g. pygame-based shells is missing. 
 | 
						|
 | 
						|
- modules/packages are often implemented in javaesque -style 
 | 
						|
 | 
						|
- distributed applications are implemented using 
 | 
						|
  a variant of Remote Method Invocation (RMI) which carries 
 | 
						|
  a lot of problems and is often difficult to deploy 
 | 
						|
  with respect to different platforms and versions. 
 | 
						|
 | 
						|
- there is no _automated_ way of installing, maintaining 
 | 
						|
  and upgrading applications 
 | 
						|
 | 
						|
The py lib tries to address these problems.  It is thus in
 | 
						|
risk of trying to do too many things at once.  Of course, we
 | 
						|
can't solve them all at once but you will find that the above
 | 
						|
points currently drive the development of the py lib. 
 | 
						|
 | 
						|
 | 
						|
Experimenting with new days, appreciating the existing ones 
 | 
						|
-----------------------------------------------------------
 | 
						|
 | 
						|
First note that we very much appreciate the great work of all
 | 
						|
the python developers and the python-dev team in particular.
 | 
						|
Criticism of old ways and experimenting with new ways doesn't
 | 
						|
imply that the old ways are bad.  But we all strive for the
 | 
						|
holy development grail at least some of the time, don't we? 
 | 
						|
 | 
						|
And because it happens far too rarely, let us especially emphasize 
 | 
						|
our appreciation for the `great work that Fred L. Drake, Jr.
 | 
						|
is doing`_ with maintaining the core Python documentation. 
 | 
						|
 | 
						|
What is the py libs current focus? 
 | 
						|
==================================
 | 
						|
 | 
						|
testing testing testing
 | 
						|
----------------------- 
 | 
						|
 | 
						|
Currently, the main focus of the py lib is to get a decent
 | 
						|
`test environment`_, indeed to produce the best one out there.  
 | 
						|
Writing, distributing and deploying tests should become
 | 
						|
a snap ... and fun! 
 | 
						|
 | 
						|
Automated tests fit very well to the dynamism of Python.
 | 
						|
Automated tests ease development and allow fast refactoring
 | 
						|
cycles.  Automated tests are a means of communication 
 | 
						|
as well. 
 | 
						|
 | 
						|
We try to allow test scripts with minimal boilerplate code or
 | 
						|
no boilerplate at all.  With the py lib you can simply use
 | 
						|
``assert`` statements in order to - well - assert something
 | 
						|
about objects in your code.  No ``assertEqual(s)`` and all the
 | 
						|
other kinds of funny names which only cover part of what you
 | 
						|
want to assert about an expression, anyway. 
 | 
						|
 | 
						|
allowing maximum refactoring in the future ... 
 | 
						|
---------------------------------------------- 
 | 
						|
 | 
						|
explicit name export control 
 | 
						|
............................
 | 
						|
 | 
						|
In order, to allow a fast development pace across versions of
 | 
						|
the py lib there is **explicit name export control**.  You
 | 
						|
will only see names which make sense to use from the outside
 | 
						|
and which the py lib developers want to guarantee across multiple
 | 
						|
revisions. However, you don't need to treat the ``py`` lib as
 | 
						|
anything special.  You can simply use the usual ``import`` 
 | 
						|
statement and will not notice much of a difference - except that 
 | 
						|
the namespaces you'll see from the ``py`` lib will be extreamly 
 | 
						|
clean and have no clutter. 
 | 
						|
 | 
						|
Indeed, much thought is given to reduce the exported *name
 | 
						|
complexity*.  This is an area where the python "batteries" and
 | 
						|
many python packages unfortunately lack a lot. They expose so
 | 
						|
many names that it becomes very hard to change APIs across
 | 
						|
releases.  People have been adding whole interface systems 
 | 
						|
because of that but arguably this adds another layer of names 
 | 
						|
instead of reducing the original problem. 
 | 
						|
 | 
						|
Anyway, exporting to many names kills the fun of refactoring
 | 
						|
and improving things.  We want to avoid that as much as
 | 
						|
possible. 
 | 
						|
 | 
						|
Upcoming Release policy & API guarantees 
 | 
						|
........................................ 
 | 
						|
 | 
						|
We'll talk about major, minor and micro numbers as the three 
 | 
						|
numbers in "1.2.3" respectively.  These are the (draft!) 
 | 
						|
release policies: 
 | 
						|
 | 
						|
- Micro-releases are bug fix releases and may not introduce 
 | 
						|
  new names to the public API. They may add tests and thus
 | 
						|
  further define the behaviour of the py lib. They may
 | 
						|
  completly change the implementation but the public API 
 | 
						|
  tests will continue to run. 
 | 
						|
 | 
						|
- No **tested feature** of the exported `py API`_ is to vanish
 | 
						|
  across minor releases until it is marked deprecated.  
 | 
						|
 | 
						|
  For example, pure API tests of a future version 1.0 are to
 | 
						|
  continue to fully run on 1.1 and so on.  If an API gets
 | 
						|
  deprecated with a minor release it goes with the next minor
 | 
						|
  release.  Thus if you don't use deprecated APIs you should 
 | 
						|
  be able to use the next two minor releases.  However, if 
 | 
						|
  you relied on some untested implementation behaviour, 
 | 
						|
  you may still get screwed.  Solution: add API tests to the
 | 
						|
  py lib :-)  It's really the tests that make the difference. 
 | 
						|
 | 
						|
- Pure API tests are not allowed to access any implementation
 | 
						|
  level details.  For example, accessing names starting with 
 | 
						|
  a single leading '_' is generally seen as an implementation 
 | 
						|
  level detail. 
 | 
						|
 | 
						|
- we intend to involve expert developers who give new APIs an
 | 
						|
  independent review before they go into a minor release 
 | 
						|
  and even more so before they go into a major release. 
 | 
						|
 | 
						|
- major releases *should*, but are not required to, pass 
 | 
						|
  all API tests of the previous latest major released 
 | 
						|
  version. A full list of changes is to be included in 
 | 
						|
  the release notes, including the tests that got abandoned. 
 | 
						|
 | 
						|
the need to find the right *paths* ...
 | 
						|
--------------------------------------
 | 
						|
 | 
						|
Another focus are well tested so called *path* implementations
 | 
						|
that allow you to seemlessly work with different backends,
 | 
						|
currently a local filesystem, subversion working copies and
 | 
						|
subversion remote URLs.  Moreover, there is an experimental
 | 
						|
``extpy`` path to address a Python object on the (possibly
 | 
						|
remote) filesystem.  The `jorendorff path.py`_ implementation
 | 
						|
goes somewhat in the same direction but doesn't try to
 | 
						|
systematically access local and remote file systems as well as
 | 
						|
other hierarchic namespaces. The latter is the focus of the
 | 
						|
``py.path`` API. 
 | 
						|
 | 
						|
If you are ready to grasp more then you may try reading
 | 
						|
about future_ coding goals of the py lib, which reflect the
 | 
						|
current developers thoughts and discussions. 
 | 
						|
 | 
						|
.. _`jorendorff path.py`: http://www.jorendorff.com/articles/python/path/
 | 
						|
 | 
						|
How does py development work? 
 | 
						|
=============================
 | 
						|
 | 
						|
Communication and coding style 
 | 
						|
------------------------------ 
 | 
						|
 | 
						|
We are discussing things on our `py-dev mailing list`_ 
 | 
						|
and collaborate via the codespeak subversion repository. 
 | 
						|
 | 
						|
We follow a `coding style`_ which strongly builds on `PEP 8`_,
 | 
						|
the basic python coding style document.  
 | 
						|
 | 
						|
It's easy to get commit rights especially if you are an
 | 
						|
experienced python developer and share some of the
 | 
						|
frustrations described above. 
 | 
						|
 | 
						|
Moreover, the world will be granted svn commit rights to all
 | 
						|
py test files so that you can easily add bug-tests or tests
 | 
						|
for behaviour to make sure the tested behaviour persists
 | 
						|
across releases. If you are itching to actually fix or
 | 
						|
refactor any implementation code you can likely get commit
 | 
						|
rights to do it. However, it is then (and anyway) a good idea to 
 | 
						|
follow the `py-dev mailing list`_ and grasp some of the things 
 | 
						|
that are going on in the `future`_ book. 
 | 
						|
 | 
						|
Licensing, please 
 | 
						|
-----------------
 | 
						|
 | 
						|
Oh right, and you should also agree to release your contributions 
 | 
						|
under an ``MIT license`` and consequently any other OSI-approved
 | 
						|
license.  This is FOSS [#]_ and we want to have the py lib interopable
 | 
						|
with whatever license style you prefer. Copyright generally
 | 
						|
stays with the contributors.  We are following the
 | 
						|
linux-kernel dev-model with this one. 
 | 
						|
 | 
						|
Hum, maybe we can also compute the individual copyrights from 
 | 
						|
the subversion blame command. Would be a fun way to handle it.
 | 
						|
Basically, nobody should ever have a problem to use the py lib
 | 
						|
under any OSI approved license and also for commercial
 | 
						|
purposes. 
 | 
						|
 | 
						|
Are there connections with PyPy_? 
 | 
						|
---------------------------------
 | 
						|
 | 
						|
Some of the motivation for writing the py lib stems from needs
 | 
						|
during PyPy_ development, most importantly testing and 
 | 
						|
file system access issues.  PyPy puts a lot of pressure 
 | 
						|
on a testing environment and thus is a great **reality test** 
 | 
						|
kind of thing. 
 | 
						|
 | 
						|
More importantly, the development perspective taken from the
 | 
						|
PyPy developers has some influence.  For example, the
 | 
						|
`envisioned import/export system`_ clearly has some thought
 | 
						|
references to the way PyPy tries to separate different levels 
 | 
						|
of objects and execution in order to reach a higher level 
 | 
						|
view of what is going on. 
 | 
						|
 | 
						|
Who is "we"? Some history ...
 | 
						|
============================= 
 | 
						|
 | 
						|
Some initial code was written from *Jens-Uwe Mager* and *Holger
 | 
						|
Krekel*, after which Holger continued on a previous
 | 
						|
incarnation of the py.test tool (known first as 'utest', then
 | 
						|
as 'std.utest', now, finally and at last 'py.test'). 
 | 
						|
 | 
						|
Helpful discussions took place with *Martijn Faassen*, *Stephan
 | 
						|
Schwarzer* and then *Armin Rigo* who contributed important parts.
 | 
						|
He and Holger came up with a couple of iterations of the
 | 
						|
testing-code that reduced the API to almost nothing: just the
 | 
						|
plain assert statement and a ``py.test.raises`` method to 
 | 
						|
check for occuring exceptions. 
 | 
						|
 | 
						|
Now recently, after Holgers `talk at EP2004`_ more people
 | 
						|
were interested and there were discussions with *Jim Fulton*, 
 | 
						|
*Marius Gedminas*, *Laura Creighton* and more recently, *Ian Bicking*.  
 | 
						|
 | 
						|
However, there is no real core development team as such, yet.
 | 
						|
Also we are somewhat lacking in the win32 area. Every now and
 | 
						|
then the py lib is tested on windows but it's currently not a
 | 
						|
practical concern of one of the current developers or
 | 
						|
contributors.  
 | 
						|
 | 
						|
However, one of the future directions of the `py.test tool and
 | 
						|
library`_ is to allow running tests across multiple python
 | 
						|
versions and computers.  Then we can run tests without having
 | 
						|
to walk up or boot up a windows machine :-) 
 | 
						|
 | 
						|
.. _`talk at EP2004`: http://codespeak.net/svn/user/hpk/talks/std-talk.txt 
 | 
						|
.. _`coding style`: coding-style.html 
 | 
						|
.. _`PEP 8`: http://www.python.org/peps/pep-0008.html
 | 
						|
.. _`py-dev mailing list`: http://codespeak.net/mailman/listinfo/py-dev 
 | 
						|
.. _`test environment`: test.html 
 | 
						|
.. _`PyPy`: http://codespeak.net/pypy
 | 
						|
.. _`envisioned import/export system`: future/future.html#importexport
 | 
						|
.. _future: future/future.html
 | 
						|
.. _`py.test tool and library`: test.html
 | 
						|
.. _`py API`: api.html 
 | 
						|
.. _`great work that Fred L. Drake, Jr. is doing`: http://www.python.org/doc/2.3.4/lib/lib.html
 | 
						|
 | 
						|
-- 
 | 
						|
 | 
						|
.. [#] FOSS is an evolving acronym for Free and Open Source Software
 | 
						|
 |