[Zope3-dev] A thought on backward compatibility and minimum versions

Jim Fulton jim at zope.com
Thu May 31 10:12:13 EDT 2007


In thinking about how we might specify that we want to depend on  
major versions but sometimes need to specify minimum versions, the  
following occurred to me:

- Suppose that we always had access to the latest released version,

- Suppose that, within a major release, all releases were backward  
compatible,

Then I assert that there is no *need* to specify a minimum release  
within a major release.

Consider an example:

I depend on foo 2 (foo >=2 <2.999).  Now foo 2.5 introduces a new  
feature and I use this feature. In reality, I now depend on version  
2.5 or higher (and <2.999).  I shouldn't need to specify this. After  
all, I'll always get new releases.  Why wouldn't I?  Well, I might  
also depend on bar and bar might depend on foo <=2.4. Why would bar  
do this?  The only sane reason is that 2.5 introduced a backward- 
incompatible change, but we don't allow that.  If we don't have to  
worry about backward incompatible changes within a major release  
cycle, then there is no reason to set an upper limit and therefore,  
there is no *practical* need to specify a lower limit.

Combined with the fact that that great majority of packages don't  
change very much after they have become stable, I think most package  
dependencies could be expressed very simply if there was a simple  
syntax to specify *just* the major version.  In the context of  
setuptools, I think "*" could be used, as has been suggested, but  
without leading =s.  So, to specify foo version 2, I think the  
following syntax would be very reasonable:

   foo 2*

This wouldn't prevent someone from specifying a minimum version.  For  
example, to combine this with a minimum requirement of 2.5:

   foo 2* >=2.5

If people like these ideas, I'd be willing to lobby for them on the  
distutils sig, especially if I have help. :)

Note that the proposal would be that, a specification of the form if  
a version number followed by a * would be equivalent to a range:

    "project_name V*" is equivalent project_name "V.*" is equivalent  
to "project_name >=V <V.99999"

(Or maybe equivalent to "project_name >=V.dev <=V.99999".)

Also note that It's not clear that the * is needed.

"foo 2" isn't a valid specification.  We *could* extend the  
requirements language to allow a project name followed by a version  
number.  So:

    "prject_name V" is equivalent to "project_name >=V <V.99999".

Jim

--
Jim Fulton			mailto:jim at zope.com		Python Powered!
CTO 				(540) 361-1714			http://www.python.org
Zope Corporation	http://www.zope.com		http://www.zope.org





More information about the Zope3-dev mailing list