Aê, rapaziada! MexApi rodando com Pelican 3.4 e dessa vez foi beeemmm menos traumático. Por isso eu vou ser breve e falarei apenas de uns detalhezinhos que surgiram durante o processo de atualização.

Para atualizar o Pelican, eu sempre clono o meu repositório em outro diretório e copio o virtualenv que uso normalmente. Isso evita que alguma cagada (minha ou da vida) estrague o brinquedo que funciona bonitinho. Faço isso assim:

$ git clone git@github.com:denydias/mexapi.git mexapi34
$ cpvirtualenv mexapi mexapi34
$ workon mexapi34

Atualizar os pacotes do Python foi igual da vez passada. Recapitulando:

$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | \
> xargs pip install --allow-external PIL --allow-insecure PIL -U

Depois de tudo atualizado é seguir pra ver onde dá pau.

$ make html
[ ! -d $OUTPUTDIR ] || find $OUTPUTDIR -mindepth 1 -delete
pelican -r $HOME/$BASEDIR/content -o $OUTPUTDIR -s $HOME/$BASEDIR/pelicanconf.py
WARNING: PLUGIN_PATH setting has been replaced by PLUGIN_PATHS, moving it to the new setting name.
WARNING: Defining PLUGIN_PATHS setting as string has been deprecated (should be a list)
WARNING: Deprecated setting ARTICLE_DIR, moving it to ARTICLE_PATHS list
WARNING: Deprecated setting PAGE_DIR, moving it to PAGE_PATHS list
  --- AutoReload Mode: Monitoring `content`, `theme` and `settings` for changes. ---
False

-> Modified: content, theme, settings. re-generating...
WARNING: Caught exception "'ascii' codec can't decode byte 0xc3 in position 26: ordinal not in range(128)". Reloading.

Alguns avisos, mas o único que preocupa mesmo é o Caught exception. Certo, 'debug mode on' e uma coisa de cada vez.

Primeiro resolvi as coisas que se tornaram obsoletas no Pelican 3.4. Isso é tão simples como dar uma lida no histórico da atualização e na nova documentação do Pelican, que aliás foi atualizada para o tema do Read the Docs e ficou bem bonita! As atualizações no pelicanconf.py são bem simples:

ARTICLE_PATHS = ['posts']
PAGE_PATHS = ['pages']
PLUGIN_PATHS = ['plugins']

Roda outra vez:

$ make html
[ ! -d $OUTPUTDIR ] || find $OUTPUTDIR -mindepth 1 -delete
pelican -r $HOME/$BASEDIR/content -o $OUTPUTDIR -s $HOME/$BASEDIR/pelicanconf.py
CRITICAL: 'ascii' codec can't decode byte 0xc3 in position 26: ordinal not in range(128)
make: ** [$OUTPUTDIR/index.html] Erro 1

Os avisos de coisas obsoletas sumiram mas o que era um aviso de Caught exception agora é um CRITICAL. Esse é o mesmo erro que ocorreu no update para o Pelican 3.3, mas eu suspeitei que ele não tivesse nada a ver com a causa de antes. Daí fui procurar algo mais relevante e achei isso:

After running the command pelican content I received the following error:

CRITICAL: 'ascii' codec can not decode byte 0xc3 in position 26: ordinal not in range (128)

-- @flaviomicheletti commented 12 days ago (github)

E logo abaixo, isso:

Looks like it's similar to #1403. Can you test with the current master? It should be resolved. You can install the master using:

pip install git+https://github.com/getpelican/pelican#egg=pelican

-- @avaris commented 12 days ago

Resolvido este problema, restou o caso do article.mdate que uso no tema do MexApi. Apesar de uma boa alma ter incluído um metadado :modified: para os artigos no Pelican 3.4, esse metadado precisa ser especificado e preenchido em cada artigo, o que eu detesto ter que fazer. O método que uso obtém a data da atualização do artigo direto do filesystem, automaticamente. E isso o Pelican ainda não tem.

Para resolver essa questão, refatorei o patch anterior para o Pelican 3.4. Ei-lo:

--- a/pelican/readers.py  2014-08-27 08:34:57.968830148 -0300
+++ b/pelican/readers.py  2014-08-27 08:03:30.400872265 -0300
@@ -544,6 +544,8 @@
                os.stat(full_path).st_ctime)
        metadata.update(settings.get('EXTRA_PATH_METADATA', {}).get(
            source_path, {}))
+    metadata['mdate'] = SafeDatetime.fromtimestamp(
+        os.stat(full_path).st_mtime)
    return metadata

Só que agora eu também fiz algo diferente: cansei de esperar alguém incluir essa função e eu mesmo enviei um pull request para o Pelican. Se os caras que mandam no terreiro aprovarem minha requisição, nunca mais terei que refatorar e aplicar esse patch quando novamente. Yay!

E pronto. Update concluído. A partir daí foi só:

$ cd ../mexapi/
$ git pull
$ workon mexapi
$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | \
> xargs pip install --allow-external PIL --allow-insecure PIL -U
$ patch ~/.virtualenvs/mexapi/lib/python2.7/site-packages/pelican/reader.py \
> plugins/patches/pelican_3.4.patch
$ make html

Tudo funcionando, resta remover o ambiente usado para fazer o update:

$ rm -rf ../mexapi34
$ rmvirtualenv mexapi34

E fim.