==================================
20140702 (Wednesday, 02 July 2014)
==================================

After some hours of sleep I looked back at what I learned and did
yesterday.

First of all, I optimized the :file:`pavement.py` file once more: the
self-signed version is in `example` and the signed version in
`example/signed`. No longer in two siblings called `example/mykey` and
`example/codegears`.  After years of fiddling with the `Makefile`,
this was a mere joy since we are now in Python.

fabric versus paver
-------------------

Then I asked: why did I not use fabric_ instead of paver_?

.. _paver: http://paver.github.io/paver/
.. _fabric: http://www.fabfile.org/
.. _unipath: https://github.com/mikeorr/Unipath

Answer: because I wanted to try something new. Because I did not feel
fully satisfied with fabric_...

But let's verify that feeling. I simply copied the content of
`pavement.py` into the `fabfile.py`, made some minor changes, and the
result is amazing: it gets yet more elegant because unipath has a
`needs_update` and a `copy` method. Yes, I liked paver's `path` trick to override `__divide__`
operator, but the `child` method in unipath_ is more explicit and
secure.

My resolution: fabric_ is clearly better than paver_.  fabric_ can
easily do what paver_ did, has better documentation and is more
mature.

::

  $ git rm pavement.py 
  $ pip uninstall paver

BTW my feeling came mainly from the fact that I don't really like the
output of :command:`fab -l`...

A pitfall in unipath
--------------------

I fell into a pitfall with unipath. The first one after more than a
year, and -after thinking at it- an unevitable one.  Here is an
excerpt from some of my code::

    jarfile = outdir.child(n)
    libfile = LIBDIR.child(n)
    if libfile.needs_update([jarfile]):
        libfile.copy(jarfile)

In a first attempt I had written::

   if libfile.needs_update(jarfile):

which gave me a strange traceback::

    Traceback (most recent call last):
      ...
      File "/home/luc/hgwork/eid/fabfile.py", line 40, in sign_jars
        if libfile.needs_update(jarfile):
      File "/home/luc/pythonenvs/py27/local/lib/python2.7/site-packages/unipath/path.py", line 298, in needs_update
        if p.isdir():
    AttributeError: 'str' object has no attribute 'isdir'

Yes, the `documentation
<https://github.com/mikeorr/Unipath#high-level-operations>`_ clearly
says that the argument to `needs_update` must be an iterable, and that
Path objects behave like strings... and to avoid that pitfall, unipath
would have to test on each whether it is a directory or not... so my
suggestion is to just update the documentation to warn about this
pitfall.

Automatic refresh every 10 seconds
----------------------------------

Added a button "autorefresh" which causes the home screen to start
refreshing every 10 seconds.  Opening any window stops the
autorefresh.

This is a quick workaround, not yet very user-friedly:

- no feedback indicating that it is activated.
- no protection against repeated clicks. every click starts a queue of
  autorefreshes.


TypeError: expected string or buffer
------------------------------------

Lino made an :ref:`ise` when reading a Belgian eID card which had the
following address data::

    streetAndNumber: null
    zip: null
    municipality: null

This caused me some work:

- Added a new test case for which reproduces the problem.  

- Discovered that these test cases were not being tested anymore.  Now
  they are, but I am not yet fully satisfied with how this is being
  done.  They are in `lino_welfare/projects/docs/tests
  <https://gitlab.com/lino-framework/lino-welfare/tree/master/lino_welfare/projects/docs/tests>`_
  (not in `/tests
  <https://gitlab.com/lino-framework/lino-welfare/tree/master/tests>`_,
  because they are written for the Django test runner. But the general
  test suite now invokes a :cmd:`django-admin test` in this
  directory).

- These test cases need to specify `no_local=True` because they need
  e.g. `use_java`.

- Added the case of an incomplete birth date to the docstring of
  :mod:`lino.utils.ssin`.

- The bug itself (in :class:`ml.beid.BaseBeIdReadCardAction`) was of
  course easy to fix.