Sunday, May 6, 2018

I fiddled around on Travis CI and readthedocs with pip, the package names of dependencies, especially appy.

We must differentiate between the dependency name and the package name. A dependency usually has the same name as the package it installs. But not always.

In the requirements.txt file of The Lino Book I had until now:

-e git+https://github.com/lino-framework/appypod.git#egg=appy

Maybe that line should rather be:

git+https://github.com/lino-framework/appypod.git#egg=appypod

Some quotations from the pip docs at pip.pypa.io:

  • Requirements files are used to override a dependency with a local patch that lives in version control. For example, suppose a dependency, SomeDependency from PyPI has a bug, and you can’t wait for an upstream fix. You could clone/copy the src, make the fix, and place it in VCS with the tag sometag. You’d reference it in your requirements file with a line like so:

    git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency
    
  • If SomeDependency was previously a top-level requirement in your requirements file, then replace that line with the new line. If SomeDependency is a sub-dependency, then add the new line.

  • It’s important to be clear that pip determines package dependencies using install_requires metadata, not by discovering requirements.txt files embedded in projects.

I tried the following in my local py3 environment:

$ pip freeze | grep appy
-e git+git@github.com:lino-framework/appypod.git@acefc6634f498a7f64c12ae9794f572357566811#egg=appy
appypod==0.1

Not sure why I have two lines there. And more surprisingly, I can uninstall them both with a single command:

$ pip uninstall appy
Uninstalling appy-0.1:
  Would remove:
    /media/dell1tb/virtualenvs/py3/lib/python3.5/site-packages/appy.egg-link
Proceed (y/n)? y
  Successfully uninstalled appy-0.1

$ pip freeze | grep appy

$ go appypod

$ pip install -e .
Obtaining file:///media/dell1tb/work/appypod
Requirement already satisfied: future in /media/dell1tb/virtualenvs/py3/lib/python3.5/site-packages (from appypod==0.1) (0.16.0)
lino-welfare 17.10.0 requires suds, which is not installed.
lino-xl 17.10.0 requires appy, which is not installed.
Installing collected packages: appypod
  Running setup.py develop for appypod
Successfully installed appypod

$ pip freeze | grep appy
appy==0.1
-e git+git@github.com:lino-framework/appypod.git@acefc6634f498a7f64c12ae9794f572357566811#egg=appypod

Now the dependency name is “appypod” and not “appy”:

$ pip uninstall appy
Not uninstalling appy at /media/dell1tb/work/appypod, outside environment /media/dell1tb/virtualenvs/py3
Can't uninstall 'appy'. No files were found to uninstall.

$ pip uninstall appypod
Uninstalling appypod-0.1:
  Would remove:
    /media/dell1tb/virtualenvs/py3/lib/python3.5/site-packages/appypod.egg-link
Proceed (y/n)? y
  Successfully uninstalled appypod-0.1

Oops, I learned only today that there is already a dependency named appypod on PyPI:

$ pip install appypod
Collecting appypod
  Downloading https://files.pythonhosted.org/packages/0d/52/0bd6ed03c5e2795ef648312e055db65496274833e9912ed0dc1ea25bad8a/appypod-0.9.6.tar.gz (121kB)
    100% |████████████████████████████████| 122kB 2.5MB/s
Building wheels for collected packages: appypod
  Running setup.py bdist_wheel for appypod ... done
  Stored in directory: /home/luc/.cache/pip/wheels/24/29/fc/96dbd1fa4d9fec170e4ef29f3f6701a8e3720e7b8f1ed1768e
Successfully built appypod
lino-welfare 17.10.0 requires suds, which is not installed.
lino-xl 17.10.0 requires appy, which is not installed.
Installing collected packages: appypod
Successfully installed appypod-0.9.6

TIL what the -e options (editable install using development mode) at the beginning of each line in our requirements.txt files are good for: without them the template files in config directories are missing. Most projects with Lino plugins have some template file. Also Appy has at least one:

FileNotFoundError: [Errno 2] No such file or directory: '/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/appy/pod/content.xmlt'

Projects that need the -e option, actually have a problem when installed by simply using pip install. Actually all template files should be declared somewhere in the setup.py or the MANIFEST.in file

This should actually not be a problem if we declare the package data correctly. For example this error message:

IOError: [Errno 2] No such file or directory: '/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/etgen/sepa/XSD/pain.001.001.02.xsd'

Should get fixed by saying:

SETUP_INFO.update(include_package_data=True, zip_safe=False)
SETUP_INFO.update(package_data={
    'etgen.sepa': ['XSD/pain.001.001.02.xsd'],
})