viernes, 28 de mayo de 2010

Escogiendo el nombre adecuado para liberar un paquete de software

Como sabemos por el nombre, que liberacion de un proyecto es mas reciente? Existe algun estandar para la tecnica de asignarle la version a un proyecto?


Resulta super util dominar la nomenclatura para nombrar las liberaciones de los proyectos a la hora de distribuirlo. Y mas aun, cuando de ese proyecto se estan liberando constantemente versiones, que queremos clasificar en estable, en desarrollo, candidatas, nocturnas, etc., de manera que la comunidad pueda guiarse por ella y saber que esta descargando.

Te has preguntado cual de las siguientes versiones es mas reciente?

version 1.2b1 o version 1.2 ?
version 0.9.1 o 0.9.1-r1234 ?
version 0.9 o 0.9pre ?
version 5.2g o 5.2 ?

Bien antes de dar respuesta, empezemos por definir que la version de un proyecto consiste en una serie alternada de "numeros de liberación" y marcas pre o post liberación.

A su vez, un "numero de liberacion" es una serie de digitos separados por ".". Donde cada serie es tratada numericamente. Con esto ultimo quiero decir que "2.1.0 equivale a 2.1"

A continuación de un "numero de liberacion", es posible poner una marca "pre-release" o "post-release".

Ejemplo:
2.1c1 pre-lease (liberacion candidata #1 a la version 2.1)
2.1-r3421 post-release (liberacion #3421 del subversion de la version 2.1)


Empezemos por los pre-release:
Consiste en una serie de letras alfabeticamente menores que la cadena "final". Ejemplos mas comunes son: alpha, beta, a, c, dev, entre otros.
No es necesario anteponer un "." despues de un numero, pues es equivalente. Esto quiere decir que:

2.3.c1 equivale a 2.3c1, y ambos significan una version previa a la 2.3

por lo tanto "2.3c1 < 2.3"

Nota: Hay tres cadenas excepcionales que son tratadas como la cadena "c". Estas son "pre", "preview", "rc".

Esto quiere decir que "5.2rc1", "5.2pre1", "5.2preview1" son equivalente a "5.2c1" y son tratadas de igual manera por setuptools.

Se usa para distinguir las ediciones previas (liberacion candidata, desarrollo, nocturna) a la liberacion estable de una version de un producto.


Y ahora con los post-release:
Consiste en una serie de letras alfabeticamente mayor o igual que la cadena "final" o "-". Es mas comun encontrarselo con la segunda variante.

Ejemplos:

3.2g1
3.2-r4155

Se usa para distinguir las versiones posteriores a partir de revisiones, compilaciones, parches, entre otros.


Mezclando Pre y Pos Release:
Despues que cada marca pre o post release, y seguido de un numero de version, puedes a su vez especificar otra marca pre o post release

Ejemplo:

1.2rc1-r1234

significa que es una version posterior, a la version candidata 1 de la version 1.2. O sea que "1.2rc1-r1234 < 1.2" pero "1.2rc1-r1234 < 1.2rc1"


COMO VERIFICAR POR CODIGO, SI UN NOMBRE DE VERSION ES MAS O MENOS RECIENTE QUE OTRO?

Si has llegado hasta este punto del articulo, te mereces que te comente como puedes probar si exactamente es una version mayor o menor que otra, usando el paquete setuotools de python


1-Instala setuptools
2-Abre una consola de python
3-Introduce el siguiente codigo de prueba


from pkg_resources import parse_version
parse_version('1.2b1') > parse_version('1.2')


Esto devuelve False, de esta manera puedes verificar cada una de las preguntas del inicio.

Interesante la funcion parse_version() no? de manera resumida te dire que a partir de la version representada como cadena, devuelve una tupla ordenable cronologicamente, de manera que al compararla con otra permita obtener la precedencia de una version sobre otra. Para mas detalles teclea:


parse_version.__doc__

Bibliografia utilizada:

http://peak.telecommunity.com/DevCenter/setuptools