Releases, Colorama y otras historias
febrero 11, 2016

Esta semana he estado revisando todos mis proyectos en Github y testeándolos un poco con las versiones nuevas de los compiladores y librerías que usan. No hay cambios en los Changelog más allá de que compilan con VS 2015 o el último MinGW, Python 3.5... este tipo de cosas.

He hecho release de todos, así que si quieres tener los últimos ejecutables de dir, GaGa, Yava, etc... están calentitos salidos del horno.

22 proyectos. Y aún me parece que empecé ayer. Solo hay un proyecto con cambios reales y necesarios, del que ya hice un postmortem en su momento: MovieWar.

Colorama y MovieWar

Colorama es la librería que uso en MovieWar para poder escribir con colores en la terminal. Es portable y funciona correctamente en Windows, Linux, etc... O eso se supone.

Probando en MSYS2 en lugar de MSYS, me di cuenta de que MovieWar no mostraba color alguno. ¿Uh?. La razón es que mintty no se comporta como una consola normal sino "no interactiva" y que además, ya es capaz por si misma de reconocer los códigos de colores ANSI sin necesidad de usar librería alguna.

Como es imposible saber bajo que consola se está ejecutando MovieWar o las cosas soporta, mi solución fue la siguiente:

El código tiene esta pinta (nota: no se pueden poner ambos parámetros a la vez):

# initialize colors as empty strings until we know we want them:
player_colors = ['', '', '', '', '']
game_color = ''

enable_colors = False

if options.colorama and HAVE_COLORAMA:
    colorama.init()
    enable_colors = True

if options.ansi_colors:
    enable_colors = True

if enable_colors:
    # red, green, yellow, magenta, cyan:
    player_colors = ['31m', '32m', '33m', '35m', '36m']

    # white:
    game_color = '37m'

Y la función para imprimir en color:

def print_color(color, message = ''):
    """
    Print a message to stdout, possibly in color.
    When the message is empty, print a newline.

    When color is an ansi code: use it for coloring.
    When color is an empty string: behave like the regular print().
    Auto-reset color back to default after printing.
    """
    if color == '':
        print(message, flush = True)
    else:
        print('\033[1;' + color + message + '\033[0m', flush = True)

Y ahora todo funciona como debería en cualquier terminal:

Debian:

MovieWar Debian

Windows, cmd.exe:

MovieWar cmd.exe

Windows, MSYS2:

MovieWar MSYS2

Otras historias

En medio de todo el embrollo, también he terminado un proyecto "nuevo" que ya está disponible en Github: Tileboard. Quizá haga un postmortem sobre él en el futuro. Es uno de esos programas que parecen triviales a simple vista, pero no lo son. De momento el README tiene bastante información.

Dejo también una curiosidad de la que mi pareja me ha hablado y que me ha gustado mucho: Astropix o "Astronomy Picture of the Day", donde hay una foto nueva sobre el cosmos cada día con explicación y todo.

Si les visitas, no dejes de echar un ojo al archivo, porque llevan haciendo esto desde el 16 de Junio del 95. Hay muchas preciosas. Me encanta ésta.