From db2d56db596f3325ca59d09b1df34bb3f58e8204 Mon Sep 17 00:00:00 2001 From: Manuel Guenther <manuel.guenther@idiap.ch> Date: Fri, 10 Oct 2014 17:05:19 +0200 Subject: [PATCH] Updated documentation and wrote tutorial-style docs for extension usage. --- README.rst | 199 +----- doc/cpp_api.rst | 240 +++++++ doc/guide.rst | 870 +++++++++++++------------ doc/index.rst | 1 + doc/links.rst | 1 + examples/bob.example.extension.tar.bz2 | Bin 0 -> 22898 bytes examples/bob.example.library.tar.bz2 | Bin 0 -> 23328 bytes examples/bob.example.project.tar.bz2 | Bin 19699 -> 19586 bytes setup.py | 3 +- 9 files changed, 706 insertions(+), 608 deletions(-) create mode 100644 doc/cpp_api.rst create mode 100644 examples/bob.example.extension.tar.bz2 create mode 100644 examples/bob.example.library.tar.bz2 diff --git a/README.rst b/README.rst index 71c2c91..80add3c 100644 --- a/README.rst +++ b/README.rst @@ -19,198 +19,15 @@ Python/C++ Bob Extension Building Support =========================================== -This package provides a simple mechanims for building Python/C++ extensions for -`Bob <http://www.idiap.ch/software/bob/>`_. You use this package by including -it in your ``setup.py`` file. - -Building with ``zc.buildout`` is possible using the ``develop`` recipe in -`bob.buildout <http://pypi.python.org/pypi/bob.buildout>`_. Follow the -instructions described on that package for this recipe. - +This package is part of the signal-processing and machine learning toolbox Bob_. +It provides a simple mechanism for using Bob_, or extending Bob_ by building packages using either a pure Python API, or even a mix of C++ and python. Further documentation on this package can be found `here <https://www.idiap.ch/software/bob/docs/latest/bioidiap/bob.extension/master/index.html>`_. -Preparing for C++ Compilation ------------------------------ - -Creating C++/Python bindings should be trivial. Firstly, edit your ``setup.py`` -so that you include the following:: - - from setuptools import dist - dist.Distribution(dict(setup_requires=['bob.extension'])) - from bob.extension import Extension, Library, build_ext - - ... - - setup( - - name="bob.myext", - version="1.0.0", - ... - - setup_requires=[ - 'bob.extension', - ], - - ... - ext_modules=[ - Extension("bob.myext._myext", - [ - "bob/myext/ext/file1.cpp", - "bob/myext/ext/file2.cpp", - "bob/myext/ext/main.cpp", - ], - packages = [ #pkg-config modules to append - 'blitz>=0.10', - ], - bob_packages = [ #optionally, bob C++ modules to import - "bob.core" - ], - include_dirs = [ #optionally, include directories - "bob/myext/ext/headers/", - ], - ), - ... #add more extensions if you wish - ], - - cmdclass = { - 'build_ext': build_ext - }, - - ... - ) - -These modifications will allow you to compile extensions that are linked -against the named ``pkg-config`` modules. Other modules and options can be set -manually using `the standard options for python extensions -<http://docs.python.org/2/extending/building.html>`_. - -Adding pure C++ libraries -------------------------- - -Most of the bob packages will include pure C++ code that can be used in other packages. -When your package should export a library with pure C++ code as well, you can build it with the ``Library`` extension. -You can simply add this ``Library`` to the list of ``ext_modules`` as follows:: - - setup( - ... - ext_modules=[ - Library("bob_myext", - [ - "bob/myext/ext/cpp/cppfile1.cpp", - "bob/myext/ext/cpp/cppfile2.cpp", - ], - package_directory = os.path.dirname(os.path.realpath(__file__)), - target_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'bob', 'myext'), - version = "1.0.0", - bob_packages = [...], - packages = [...], - ... - ), - Extension("bob.my_ext._myext", - ... - libraries = ["bob_myext",...] - ) - ], - - cmdclass = { - 'build_ext': build_ext - }, - - ... - ) - -This will compile the given source files of the library using `CMake <http://www.cmake.org>`_. -Please assure that the name of the library ``bob_myext`` is compatible with your package name so that the library can be imported in other packages using the ``bob_packages`` list. - -Also, it is assumed that **all** header files that are exported by the C++ library are listed in the *bob/myext/include* directory. -This directory is automatically added to the list of include directories -- in your own package and in all other packages that use the ``bob_packages`` list. - -Compiling the module --------------------- - -To hook-in the building on the package through ``zc.buildout``, add the following section to your ``buildout.cfg``:: - - [bob.myext] - recipe = bob.buildout:develop - verbose = true ;enables command-line verbosity - debug = true ;compiles the module in debug mode - -If you need to build multiple eggs, you will need **one entry per project** on -your ``buildout.cfg``. This includes, possibly, dependent projects. Currently, -``zc.buildout`` ignores the ``setup_requires`` entry on your ``setup.py`` file. -The recipe above creates a new interpreter that hooks that package in and -builds the project considering variables like ``prefixes`` into consideration. - -By default, the extension code is compiled into a local directory called ``build``. -This directory, after compilation, can be removed without issues, the resulting libraries will be copied into the package directories. -To change the build directory of your package, and all other bob packages, you can define the ``BOB_BUILD_DIRECTORY`` environment variable, e.g.,:: - - $ python bootstrap.py - $ BOB_BUILD_DIRECTORY=/tmp/bob_build_dir ./bin/buildout - -Again, after successful compilation, this directory can be removed safely. - - -Python API to pkg-config and Boost ----------------------------------- - -This package alson contains a set of Pythonic bindings to the popular -pkg-config configuration utility. It allows distutils-based setup files to -query for libraries installed on the current system through that command line -utility. library. - -Using the ``pkgconfig`` class -============================= - -To use this package at your ``setup.py`` file, you will need to let distutils -know it needs it before importing it. You can achieve this with the following -trick:: - - from setuptools import dist - dist.Distribution(dict(setup_requires='bob.extension')) - from bob.extension.pkgconfig import pkgconfig - -.. note:: - - In this case, distutils should automatically download and install this - package on the environment it is required to setup other package. - -After inclusion, you can just instantiate an object of type ``pkgconfig``:: - - >>> zlib = pkgconfig('zlib') - >>> zlib.version # doctest: SKIP - 1.2.8 - >>> zlib.include_directories() # doctest: SKIP - ['/usr/include'] - >>> zlib.library_dirs # doctest: SKIP - ['/usr/lib'] - >>> zlib > '1.2.6' - True - >>> zlib > '1.2.10' - False - - -Using the ``boost`` class -========================= - -To use this package at your ``setup.py`` file, you will also need the same -trick as with ``pkgconfig``:: - - from setuptools import dist - dist.Distribution(dict(setup_requires='bob.extension')) - from bob.extension.boost import boost - -After inclusion, you can just instantiate an object of type ``boost``:: - - >>> boost_pkg = boost('>= 1.47') - >>> boost.version # doctest: SKIP - 1.50.0 - >>> boost.include_directory # doctest: SKIP - '/usr/include' - >>> libpaths, libnames = boost.libconfig(['system', 'python']) - >>> print(libpaths) # doctest: SKIP - ['/usr/lib'] - >>> print(libnames) # doctest: SKIP - ['boost_system-mt', 'boost_python-mt-py27'] +Installation +------------ +To install this package -- alone or together with other `Packages of Bob <https://github.com/idiap/bob/wiki/Packages>`_ -- please read the `Installation Instructions <https://github.com/idiap/bob/wiki/Installation>`_. +For Bob_ to be able to work properly, some dependent packages mus be installed. +Please make sure that you have read the `Dependencies <https://github.com/idiap/bob/wiki/Dependencies>`_ for your operating system. +.. _bob: https://www.idiap.ch/software/bob diff --git a/doc/cpp_api.rst b/doc/cpp_api.rst new file mode 100644 index 0000000..8cf517d --- /dev/null +++ b/doc/cpp_api.rst @@ -0,0 +1,240 @@ +.. vim: set fileencoding=utf-8 : +.. Manuel Guenther <manuel.guenther@idiap.ch> +.. Fri Oct 10 14:03:53 CEST 2014 +.. +.. Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland + +====================================== + C++ API of the Documentation classes +====================================== + +This section includes information for using the pure C++ API for the documentation classes, which can be accessed after including: + +.. code-block:: c++ + + # include <bob.extension/documentation.h> + +The classes, which are described in more detail below, can be used to format the documentation of your C/C++ functions that are bound to Python. +Any free text that you specify to describe your functions will be interpreted as `reStructuredText <http://docutils.sourceforge.net/rst.html>`_. +Hence, it is possible to use any directives like ``.. note::``, ``.. math::``, and even links inside the documentation like ``:py:class:`` and references as ``[REF]_``. + + +Function Documentation +---------------------- + +.. cpp:class:: bob::extension::FunctionDoc + + To document a function (either a stand-alone function or a member function of a class), you should use the :cpp:class:`bob::extension::FunctionDoc`. + + .. cpp:function:: FunctionDoc(\ + const char* const function_name,\ + const char* const short_desctiption,\ + const char* const long_description = NULL,\ + bool is_member_function = false\ + ) + + In the constructor, you specify the function name and a short description. + If wanted, you can define a longer description as well. + When you use this FunctionDoc to document a member function of a class, please set ``is_member_function = true``. + + + .. cpp:function:: FunctionDoc& add_prototype(\ + const char* const variables,\ + const char* const return_value = "None"\ + ) + + Adds a prototype of the documented function declaration to the function. + All ``variables`` and all ``return_value``'s listed must be documented using the :cpp:func:`add_parameter` or :cpp:func:`add_return` functions. + Only the default return value ``None`` does not need documentation. + + ``variables`` is a single string containing a comma-separated list of parameter names. + Use ``..., [name]`` to indicate that name is ``name`` is an optional parameter. + + ``return_value`` is a single string containing a comma-separated list of return value names. + If a single name is given, only a single value is returned, otherwise a tuple will be returned by your function. + + .. note:: + Each :cpp:class:`FunctionDoc` needs at least one prototype. + In opposition to pure Python functions, specifying multiple prototypes is allowed here as well. + + + .. cpp:function:: FunctionDoc& add_parameter(\ + const char* const parameter_name,\ + const char* const parameter_type,\ + const char* const parameter_description\ + ) + + Adds a description for a given parameter. + + ``parameter_name`` must be one of the names listed in the ``variables`` of the :cpp:func:`add_prototype` function. + + ``parameter_type`` specifies the expected type of this parameter. + You can use any free text to describe the type. + When ``:py:class:`` directives or similar are used, they will be interpreted correctly. + + ``parameter_description`` includes free text to describe, what the parameter is used for. + + + .. cpp:function:: FunctionDoc& add_return(\ + const char* const return_name,\ + const char* const return_type,\ + const char* const return_description\ + ) + + Adds a description for a given return value. + + ``return_name`` must be one of the names listed as a ``return_value`` of the :cpp:func:`add_prototype` function. + + ``return_type`` specifies the type of this return value. + You can use any free text to describe the type. + When ``:py:class:`` directives or similar are used, they will be interpreted correctly. + + ``return_description`` includes free text to describe, what the return value contains. + + + .. cpp:function:: const char* const name() const + + Returns the name of the function defined in the constructor. + + + .. cpp:function:: const char* const doc(const unsigned alignment = 72, const unsigned indent = 0) const + + Generates and returns the documentation string. + The free text in the documentation is aligned to ``alignment`` characters, by default 72, so that it can be viewed correctly inside of an 80-character Python console. + The ``indent`` is an internal parameter and should not be changed. + + + .. cpp:function:: void print_usage() const + + Prints a function usage string to console, including all information specified by the member functions above. + + +All functions adding information to the :cpp:class:`bob::extension::FunctionDoc` return a reference to the current object, so that you can use it inline, like: + +.. code-block:: c++ + + auto function_doc = bob::extension::FunctionDoc( + "function_name", + "Short description of the function", + "Long description of the function using reStructuredText including directives like :py:class:`bob.blitz.array`." + ) + .add_prototype("param1, [param2]", "ret") + .add_parameter("param1", "int", "An int value used for ...") + .add_parameter("param2", "float", "[Default: ``0.5``] A float value describing ...") + .add_return("ret", ":py:class:`bob.blitz.array`", "An array ...") + ; + +During the binding of your function, you can use it, like: + +.. code-block:: c++ + + static PyMethodDef module_methods[] = { + ... + { + function_doc.name(), + (PyCFunction)function, + METH_VARARGS|METH_KEYWORDS, + function_doc.doc() + }, + ... + }; + + +Variables Documentation +----------------------- + +.. cpp:class:: bob::extension::VariableDoc + + To document a variable (either a stand-alone function or a member function of a class), you should use the :cpp:class:`bob::extension::VariableDoc`. + + .. cpp:function:: VariableDoc(\ + const char* const variable_name,\ + const char* const variable_type,\ + const char* const short_desctiption,\ + const char* const long_description = NULL\ + ) + + In the constructor, you specify the variable name, its type and a short description. + The structure is identical to the :cpp:func:`FunctionDoc::add_parameter` function. + If wanted, you can define a longer description as well. + + + .. cpp:function:: char* name() const + + Returns the name of the variable defined in the constructor. + + + .. cpp:function:: char* doc(const unsigned alignment = 72) const + + Generates and returns the documentation string, which is composed of the information provided in the constructor. + The free text in the documentation is aligned to ``alignment`` characters, by default 72, so that it can be viewed correctly inside of an 80-character Python console. + + +Class Documentation +------------------- + +.. cpp:class:: bob::extension::ClassDoc + + To document a function (either a stand-alone function or a member function of a class), you should use the :cpp:class:`bob::extension::FunctionDoc`. + + .. cpp:function:: ClassDoc(\ + const char* const class_name,\ + const char* const short_desctiption,\ + const char* const long_description = NULL\ + ) + + In the constructor, you specify the class name and a short description. + If wanted, you can define a longer description as well. + + + .. cpp:function:: ClassDoc& add_constructor(\ + const FunctionDoc& constructor_doc\ + ) + + Adds the documentation of the constructor, which itself is a :cpp:class:`FunctionDoc`. + + .. note:: + You should specify the return value of your constructor to be ``""`` to overwrite the default value ``"None"``. + + .. note:: + A class can have only a single constructor documentation. + Hence, this function can be called only once for each class. + + + .. cpp:function:: char* name() const + + Returns the name of the class defined in the constructor. + + + .. cpp:function:: char* doc(const unsigned alignment = 72) const + + Generates and returns the documentation string, which is composed of the information provided in the constructor, and the constructor documentation. + The free text in the documentation is aligned to ``alignment`` characters, by default 72, so that it can be viewed correctly inside of an 80-character Python console. + + .. cpp:function:: void print_usage() const + + Prints the usage of the constructor. + See :cpp:func:`FunctionDoc::print_usage` for details. + + +As for functions, the :cpp:class:`bob::extension::ClassDoc` is designed to be used inline, like: + +.. code-block:: c++ + + auto class_doc = bob::extension::ClassDoc( + "class_name", + "Short description of the class", + "Long description of the class using reStructuredText including directives like :py:class:`bob.blitz.array`." + ) + .add_constructor( + bob::extension::FunctionDoc( + "class_name", + "Short description of the constructor", + "Long description of the constructor" + true + ) + .add_prototype("param1, [param2]", "") + .add_parameter("param1", "int", "An int value used for ...") + .add_parameter("param2", "float", "[Default: ``0.5``] A float value describing ...") + ); + diff --git a/doc/guide.rst b/doc/guide.rst index a4e630b..c7a7d14 100644 --- a/doc/guide.rst +++ b/doc/guide.rst @@ -6,219 +6,301 @@ |project| Satellite Package Development and Maintenance ========================================================= -This tutorial explains how to build and distribute `Python`-based working -environments for |project|. By following these instructions you will be able -to: - -* Create a basic working environment using either a stock |project| - installation or your own compiled (and possibly uninstalled) version of - |project|; -* Install additional python packages to augment your virtual work environment - capabilities - e.g., to include a new python package for a specific purpose - covering functionality that does not necessarily exists in |project| or any - available Satellite Package; +This tutorial explains how to build and distribute `Python`-based working environments for |project|. +By following these instructions you will be able to: + +* Download and install |project| packages to build a global or local working environment including |project|; +* Install python packages to augment your virtual work environment capabilities -- e.g., to include a new python package for a specific purpose covering functionality that does not necessarily exists in |project| or any available Satellite Package; +* Implement your own satellite package including either pure Python code, a mixture of C/C++ and Python code, and even pure C/C++ libraries with clean C/C++ interfaces that might be used by other researchers; * Distribute your work to others in a clean and organized manner. -These instructions heavily rely on the use of Python `distutils`_ and -`zc.buildout`_. One important advantage of using `zc.buildout`_ is that it does -**not** require administrator privileges for setting up any of the above. -Furthermore, you will be able to create distributable environments for each -project you have. This is a great way to release code for laboratory exercises -or for a particular publication that depends on |project|. +These instructions heavily rely on the use of Python `distutils`_ and `zc.buildout`_. +One important advantage of using `zc.buildout`_ is that it does **not** require administrator privileges for setting up any of the above. +Furthermore, you will be able to create distributable environments for each project you have. +This is a great way to release code for laboratory exercises or for a particular publication that depends on |project|. .. note:: - The core of our strategy is based on standard tools for *defining* and - *deploying* Python packages. If you are not familiar with Python's - ``setuptools``, ``distutils`` or PyPI, it can be beneficial to `learn about - those <http://guide.python-distribute.org/>`_ before you start. Python - `Setuptools`_ and `Distutils`_ are mechanisms to *define and distribute* - python code in a packaged format, optionally through `PyPI`_, a web-based - Python package index and distribution portal. + The core of our strategy is based on standard tools for *defining* and *deploying* Python packages. + If you are not familiar with Python's ``setuptools``, ``distutils`` or PyPI, it can be beneficial to `learn about those <http://guide.python-distribute.org/>`_ before you start. + Python's `Setuptools`_ and `Distutils`_ are mechanisms to *define and distribute* python code in a packaged format, optionally through `PyPI`_, a web-based Python package index and distribution portal. + + `zc.buildout`_ is a tool to *deploy* Python packages locally, automatically setting up and encapsulating your work environment. - `zc.buildout`_ is a tool to *deploy* Python packages locally, automatically - setting up and encapsulating your work environment. Anatomy of a buildout Python package ------------------------------------ -The best way to create your package is to download a `skeleton from the Idiap -GitHub website <https://github.com/idiap/bob.project.example>`_ and build on -it, modifying what you need. Fire-up a shell window and than do this: +The best way to create your package is to download one of the skeletons that are described in this tutorial and build on it, modifying what you need. +Fire-up a shell window and than do this: .. code-block:: sh - $ git clone --depth=1 https://github.com/idiap/bob.project.example.git - $ cd bob.project.example - $ rm -rf .git #this is optional - you won't need the .git directory + $ wget https://github.com/bioidiap/bob.extension/raw/master/examples/bob.example.project.tar.bz2 + $ tar -xjf bob.example.project.tar.bz2 + $ cd bob.example.project -We now recommend you read the file ``README.rst`` situated at the root of the -just downloaded material. It contains important information on other -functionality such as document generation and unit testing, which will not be -covered on this introductory material. +We now recommend you read the file ``README.rst``, which is written in `reStructuredText <http://docutils.sourceforge.net/rst.html>`_ format, situated at the root of the just downloaded material. +It contains important information on other functionality such as document generation and unit testing, which will not be covered on this introductory material. The anatomy of a minimal package should look like the following: .. code-block:: sh . - +-- MANIFEST.in # extras to be installed, besides the python files - +-- README.rst # a description of the package, in restructured-text format - +-- bootstrap.py # stock script downloaded from zc.buildout's website - +-- buildout.cfg # buildout configuration - +-- setup.py # installation + requirements for this particular package - +-- docs # documentation directory - | +-- conf.py # Sphinx configuration - | +-- index.rst # Documentation starting point for Sphinx - +-- bob # python package (a.k.a. "the code") + +-- MANIFEST.in # extras to be installed, besides the python files + +-- README.rst # a description of the package, in reStructuredText format + +-- bootstrap.py # stock script downloaded from zc.buildout's website + +-- buildout.cfg # buildout configuration + +-- setup.py # installation + requirements for this particular package + +-- doc # documentation directory + | +-- conf.py # Sphinx configuration + | +-- index.rst # Documentation starting point for Sphinx + +-- bob # python package (a.k.a. "the code") | +-- example - | | +-- script + | | +-- project + | | | +-- script + | | | | +-- __init__.py + | | | | +-- version.py | | | +-- __init__.py - | | | +-- version.py + | | | +-- test.py | | +-- __init__.py - | | +-- test.py | +-- __init__.py -Our example that you just downloaded contains these files and a few extra ones -useful for this tutorial. Inspect the package so you are aware of its contents. -All files are in text format and should be heavily commented. The most -important file that requires your attention is ``setup.py``. This file contains -the basic information for the Python package you will be creating. It defines -scripts the package provides and dependencies it requires for execution. To -customize the package to your needs, you will need to edit this file and modify -it accordingly. Before doing so, it is suggested you go through all of this -tutorial so you are familiar with the whole environment. The example package, -as it is distributed, contains a fully working example. - -In the remainder of this document, we explain how to setup ``buildout.cfg`` so -you can work in different operational modes - the ones which are more common -development scenarios. +Our example that you just downloaded contains these files and a few extra ones useful for this tutorial. +Inspect the package so you are aware of its contents. +All files are in text format and should be heavily commented. +The most important file that requires your attention is ``setup.py``. +This file contains the basic information for the Python package you will be creating. +It defines scripts the package provides and dependencies it requires for execution. +To customize the package to your needs, you will need to edit this file and modify it accordingly. +Before doing so, it is suggested you go through all of this tutorial so you are familiar with the whole environment. +The example package, as it is distributed, contains a fully working example. + +In the remainder of this document, we explain how to setup ``buildout.cfg`` so you can work in different operational modes - the ones which are more common development scenarios. + Pure-Python Packages -------------------- -Pure-Python packages are the most common. They contain code that is exclusively -written in Python. This contrasts to packages that are written in a mixture of -Python and C/C++. +Pure-Python packages are the most common. +They contain code that is exclusively written in Python. +This contrasts to packages that are written in a mixture of Python and C/C++, which are explained in more detail below. + +The package you cloned above is a pure-Python example package and contains all elements to get you started. +It defines a single library module called ``bob.example.project``, which declares a simple script, called ``version.py`` that prints out the version of the dependent library ``bob.blitz``. +When you clone the package, you will not find any executable as ``buildout`` needs to check all dependencies and install missing ones before you can execute anything. +Particularly, it inspects the ``setup.py`` file in the root directory of the package, which contains all required information to build the package, all of which is contained in the ``setup`` function: + +.. code-block:: python + + setup( + name = 'bob.example.project', + version = '0.0.1a0', + ... + packages = find_packages(), + ... + install_requires = [ + 'setuptools', + 'bob.blitz' + ], + ... + namespace_packages = [ + 'bob', + 'bob.example', + ], + ... + entry_points = { + 'console_scripts' : [ + 'version.py = bob.example.project.script.version:main', + ], + }, + ) + +In detail, it defines the name and the version of this package, which files belong to the package (those files are automatically collected by the ``find_packages`` function), other packages that we depend on, namespaces (see below) and console scripts. +The full set of options can be inspected in the `Setuptools documentation <http://pythonhosted.org/setuptools/setuptools.html>`_. -The package you cloned above is a pure-Python example package and contains all -elements to get you started. It defines a single library inside called -``bob.example``, which declares a simple script, called ``version.py`` that -prints out the version of |project|. When you clone the package, you will not -find any executable as ``buildout`` needs to check all dependencies and install -missing ones before you can execute anything. Here is how to go from nothing to -everything: +To be able to use the package, we first need to build it. +Here is how to go from nothing to everything: .. code-block:: sh $ python bootstrap.py - Creating directory '/home/user/work/tmp/bob.project.example/bin'. - Creating directory '/home/user/work/tmp/bob.project.example/parts'. - Creating directory '/home/user/work/tmp/bob.project.example/eggs'. - Creating directory '/home/user/work/tmp/bob.project.example/develop-eggs'. - Generated script '/home/user/work/tmp/bob.project.example/bin/buildout'. + Creating directory '/home/user/bob.example.project/bin'. + Creating directory '/home/user/bob.example.project/parts'. + Creating directory '/home/user/bob.example.project/eggs'. + Creating directory '/home/user/bob.example.project/develop-eggs'. + Generated script '/home/user/bob.example.project/bin/buildout'. $ ./bin/buildout - Develop: '/remote/filer.gx/user.active/aanjos/work/tmp/bob.project.example/.' Getting distribution for 'bob.buildout'. - Got bob.buildout 0.2.13. + Got bob.buildout 2.0.0. Getting distribution for 'zc.recipe.egg>=2.0.0a3'. - Got zc.recipe.egg 2.0.0. - Installing scripts. + Got zc.recipe.egg 2.0.1. + Develop: '/home/user/bob.example.project/.' + ... + Installing scripts. + Getting distribution for 'bob.extension'. + Processing bob.blitz-2.0.0.zip + ... + Got bob.blitz 2.0.0. ... .. note:: + The Python shell used in the first line of the previous command set determines the Python interpreter that will be used for all scripts developed inside this package. + To build your environment around a different version of Python, just make sure to correctly choose the interpreter you wish to use. + If you just want to get things rolling, using ``python bootstrap.py`` will, in most cases, do the right thing. - The Python shell used in the first line of the previous command set - determines the Python interpreter that will be used for all scripts developed - inside this package. To build your environment around a different version of - Python, just make sure to correctly choose the interpreter you wish to use. - If you just want to get things rolling, using ``python bootstrap.py`` will, - in most cases, do the right thing. +.. note:: + When you have installed an older version of |project| -- i.e. |project| v1.x, you might need to uninstall it first, see https://github.com/idiap/bob/wiki/Installation. You should now be able to execute ``./bin/version.py``: .. code-block:: sh $ ./bin/version.py - The installed version of bob.blitz is `2.0.0a0' - bob.blitz is installed at `...' - bob.blitz depends on the following Python packages: - * bob.extension: 0.3.0a0 (...) - * numpy: 1.6.2 (/usr/lib/python2.7/dist-packages) - * distribute: 0.6.28dev-r0 (/usr/lib/python2.7/dist-packages) - * coverage: 3.7.1 (...) - * sphinx: 1.1.3 (/usr/lib/python2.7/dist-packages) - * nose: 1.1.2 (/usr/lib/python2.7/dist-packages) - * docutils: 0.8.1 (/usr/lib/python2.7/dist-packages) - * jinja2: 2.6 (/usr/lib/python2.7/dist-packages) - * pygments: 1.5 (/usr/lib/python2.7/dist-packages) - bob.blitz depends on the following C/C++ APIs: - * Python: 2.7.3 - * Boost: 1.50.0 - * Blitz++: 0.10 - * NumPy: 0x01000009 - * Compiler: ('gcc', '4.7.2') + bob.blitz: 2.0.0a0 [api=0x0200] (/home/user/bob.example.project/eggs/bob.blitz-2.0.0a0-py2.7-linux-x86_64.egg) + - c/c++ dependencies: + - Blitz++: 0.10 + - Boost: 1.55.0 + - Compiler: {'version': '4.7.2', 'name': 'gcc'} + - NumPy: {'abi': '0x01000009', 'api': '0x00000009'} + - Python: 2.7.8 + - python dependencies: + - bob.extension: 0.3.0a0 (/home/user/bob.example.project/eggs/bob.extension-0.3.0a0-py2.7.egg) + - numpy: 1.8.1 (/usr/lib/python2.7/site-packages) + - setuptools: 5.4.1 (/home/user/bob.example.project/eggs/setuptools-5.4.1-py2.7.egg) Everything is now setup for you to continue the development of this package. -Modify all required files to setup your own package name, description and -dependencies. Start adding files to your library (or libraries) and, if you -wish, make this package available in a place with public access to make your -research public. We recommend using GitHub. Optionally, `drop-us a message -<https://groups.google.com/d/forum/bob-devel>`_ talking about the availability -of this package so we can add it to the growing list of `Satellite Packages`_. +Modify all required files to setup your own package name, description and dependencies. +Start adding files to your library (or libraries) and, if you wish, make this package available in a place with public access to make your research public. +We recommend using GitHub. +Optionally, `drop-us a message <https://groups.google.com/d/forum/bob-devel>`_ talking about the availability of this package so we can add it to the growing list of `Satellite Packages`_. + + +Python Package Namespace +======================== + +We like to make use of namespaces to define combined sets of functionality that go well together. +Python package namespaces are `explained in details here <http://peak.telecommunity.com/DevCenter/setuptools#namespace-package>`_ together with implementation details. +For bob packages, we usually use the ``bob`` namespace, using several sub-namespaces such as ``bob.io``, ``bob.ip``, ``bob.learn``, ``bob.db`` or (like here) ``bob.example``. + +In particular, if you are creating a database access API, please consider putting all of your package contents *inside* the namespace ``bob.db.<package>``, therefore declaring two namespaces: ``bob`` and ``bob.db``. +All standard database access APIs follow this strategy. +Just look at our currently existing database `satellite packages`_ for examples. + + +Creating Database Satellite Packages +==================================== + +Database satellite packages are special satellite packages that can hook-in |project|'s database manager ``bob_dbmanage.py``. +Except for this detail, they should look exactly like a normal package. + +To allow the database to be hooked to the ``bob_dbmanage.py`` you must implement a non-virtual python class that inherits from :py:class:`bob.db.driver.Interface`. +Your concrete implementation should then be described at the ``setup.py`` file with a special ``bob.db`` entry point: + +.. code-block:: python + + # bob database declaration + 'bob.db': [ + 'example = bob.db.example.driver:Interface', + ], + +At present, there is no formal design guide for databases. +Nevertheless, it is considered a good practice to follow the design of currently existing database `satellite packages`_. +This should ease migration in case of future changes. + C or C++/Python Packages ------------------------ -Creating C++/Python bindings should be rather. Firstly, edit your ``setup.py`` -so that you include the following: +Creating C++/Python bindings should be rather straightforward. +Only few adaptations need to be performed to get the C/C++ code being compiled and added as an extension. +For simplicity, we created an example package that includes a simple example of a C++ extension. +You can check it out by: + +.. code-block:: sh + + $ wget https://github.com/bioidiap/bob.extension/raw/master/examples/bob.example.extension.tar.bz2 + $ tar -xjf bob.example.extension.tar.bz2 + $ cd bob.example.extension + +One difference is that now an additional file ``requirements.txt`` can be found in the root directory of the package. +In this file, all packages that are **directly** required to compile the C/C++ code in your package. +**Indirectly** required packages will be downloaded and installed automatically. +For our example, this is only the ``bob.blitz`` package. + +The second big difference comes in the ``setup.py``. +To be able to import ``bob.extension`` and ``bob.blitz`` in the setup.py, we need to include some code: .. code-block:: python + setup_packages = ['bob.extension', 'bob.blitz'] + bob_packages = [] + from setuptools import setup, find_packages, dist - dist.Distribution(dict(setup_requires=['bob.blitz', 'bob.core', 'bob.math'])) - from bob.blitz.extension import Extension - ... + dist.Distribution(dict(setup_requires = setup_packages + bob_packages)) - setup( +We keep the ``setup_packages`` and ``bob_packages`` in separate variables since we will need them later. +The ``bob_packages`` contain a list of bob packages that this extension **directly** depends on. +In our example, we only depend on ``bob.blitz``, and we can leave the list empty. - name="bob.myext", - version="1.0.0", - ... - install_requires=[ - 'setuptools', - 'bob.blitz', - ], +As the second step, we need to add some lines in the header of the file to tell the ``setuptools`` system to compile our library with our ``Extension`` class: + +.. code-block:: python + + # import the Extension class and the build_ext function from bob.blitz + from bob.blitz.extension import Extension, build_ext + + # load the requirements.txt for additional requirements + from bob.extension.utils import load_requirements + build_requires = setup_packages + bob_packages + load_requirements() + +In fact, we don't use the extension from :py:class:`bob.extension.Extension`, but the one from ``bob.blitz.extension``, which is a derivation of this package. +The difference is that in :py:class:`bob.blitz.extension.Extension` all header files and libraries for the ``Blitz++`` library are added. + +Third, we have to add an extension using the ``Extension`` class, by listing all C/C++ files that should be compiled into the extension: + +.. code-block:: python + + setup( ... - namespace_packages=[ - 'bob', - ], + setup_requires = build_requires, + install_requires = build_requires, ... - ext_modules=[ + ext_modules = [ Extension("bob.myext._myext", [ "bob/myext/ext/file1.cpp", "bob/myext/ext/file2.cpp", "bob/myext/ext/main.cpp", ], - bob_packages = [ #packages of bob to compile and link against - 'bob.core', - 'bob.math', - ], - packages = [ #other c/c++ api dependencies - 'boost', - ], - boost_modules = [ # list of boost modules that should be linked - 'filesystem' - ] + version = "1.0.0", + bob_packages = bob_packages ), ... #add more extensions if you wish ], + ... + ) + +These modifications will allow you to compile extensions that are linked against our core Python-C++ bridge ``bob.blitz`` (be default). +You can specify any other ``pkg-config`` module and that will be linked in (for example, ``boost`` or ``opencv``) using the ``packages`` parameter. +For ``boost`` packages, you might need to define, which boost modules are required. +By default, when using boost you should at least add the ``system`` module, i.e., by: +.. code-block:: python + + setup( + ... + ext_modules = [ + Extension( + ... + packages = ['boost'], + boost_modules = ['system'], + ), + ... + ], ... ) -These modifications will allow you to compile extensions that are linked against our core Python-C++ bridge ``bob.blitz`` (be default), as well as ``bob.core`` and ``bob.math``. -You can specify any other ``pkg-config`` module and that will be linked in (for example, ``boost`` or ``opencv``) using the ``packages`` setting as shown above. Other modules and options can be set manually using `the standard options for python extensions <http://docs.python.org/2/extending/building.html>`_. Most of the bob packages come with pure C++ code and python bindings. @@ -226,47 +308,88 @@ When your library compiles and links against the pure C++ code, you can simply u This will automatically add the desired include and library directories, as well as the libraries and the required preprocessor options. .. note:: - All ``bob_packages`` that you list have to be listed in the ``setup_requires`` line as in the second line of the above example. + Usually we provide one extension ``version`` that deals with versioning. + One example of such a ``version`` extension can be found in our example. + +In our example, we have defined a small C++ function, which also shows the basic bridge between ``numpy.ndarray`` and our C++ pendant ``Blitz++``. +Basically, there are two C++ files for our extension. +``bob/example/extension/Function.cpp`` contains the pure C++ implementation of the function. +In ``bob/example/extension/main.cpp``, we define the Python bindings to that function, including the creation of a complete Python module called ``_library``. +Additionally, we give a short example of how to use our documentation classes provided in this module (see below for more details). +Finally, the function ``reverse`` from the module ``_library`` is imported into our module in the ``bob/example/extension/__init__.py`` file. + +To compile your C++ Python bindings and the pure C++ libraries, you can follow the same instructions as shown above: + +.. code-block:: sh + + $ python bootstrap.py + ... + $ ./bin/buildout + ... + +.. note:: + By default, we compile the source code (of this and all dependent packages) in debug mode. + If you want to change that, switch the according flag in the ``buildout.cfg`` to ``debug = False``, and the compilation will be done with optimization flags enabled. -Pure C++ Libraries Inside your Package -====================================== +Now, we can use the script ``./bin/reverse.py`` (that we have registered in the ``setup.py``) to reverse a list of floats, using the C++ implementation of the ``reverse`` function: + +.. code-block:: sh + + $ ./bin/reverse.py 1 2 3 4 5 + [1.0, 2.0, 3.0, 4.0, 5.0] reversed is [ 5. 4. 3. 2. 1.] + +We can also see that the function documentation has made it into the module, too: + +.. code-block:: sh + + $ ./bin/python + >>> import bob.example.extension + >>> help(bob.example.extension) + +and that we can list version and the dependencies of our package: + +.. code-block:: sh + + >>> print (bob.example.extension.version) + 0.0.1a0 + >>> print (bob.example.extension.get_config()) + ... + + +Pure C/C++ Libraries Inside your Package +======================================== If you want to provide a library with pure C++ code in your package as well, you can use the :py:class:`bob.extension.Library` class. -It will automatically compile your C++ code using `CMake <http://www.cmake.org>`_ into a shared library that you can import in your own C++/Python bindings, as well as in other packages. +It will automatically compile your C/C++ code using `CMake <http://www.cmake.org>`_ into a shared library that you can import in your own C/C++-Python bindings, as well as in other packages. +Again, a complete example can be downloaded via: + +.. code-block:: sh + + $ wget https://github.com/bioidiap/bob.extension/raw/master/examples/bob.example.library.tar.bz2 + $ tar -xjf bob.example.library.tar.bz2 + $ cd bob.example.library To generate a Library, simply add it in the list of ``ext_modules``: .. code-block:: python - from setuptools import setup, find_packages, dist - dist.Distribution(dict(setup_requires=['bob.blitz', 'bob.core', 'bob.math'])) + ... + # import the Extension and Library classes and the build_ext function from bob.blitz from bob.blitz.extension import Extension, Library, build_ext ... setup( - name="bob.myext", - version="1.0.0", - ... - install_requires=[ - 'setuptools', - 'bob.blitz', - ], - ... - namespace_packages=[ - 'bob', - ], - ... - ext_modules=[ + ext_modules = [ + # declare a pure C/C++ library just the same way as an extension Library("bob.myext.bob_myext", [ "bob/myext/cpp/pure_cpp_file1.cpp", "bob/myext/cpp/pure_cpp_file2.cpp", ], version = "1.0.0", - bob_packages = [...], - packages = [...], + bob_packages = bob_packages, ), ... #add more Extensions if you wish ], @@ -278,21 +401,24 @@ To generate a Library, simply add it in the list of ``ext_modules``: ... ) - -The :py:class:`bob.extension.Library` class has mostly the same parameters as the :py:class:`bob.extension.Extension` class. -To avoid later complications, you should follow two guidelines for bob packages: +Again, we use the overloaded library class :py:class:`bob.blitz.extension.Library` instead of the :py:class:`bob.extension.Library`, but the parameters are identical, and identical to the ones of the :py:class:`bob.extension.Extension`. +To avoid later complications, you should follow the guidelines for libraries in bob packages: 1. The name of the C++ library need to be identical to the name of your package (replacing the '.' by '_'). Also, the package name need to be part of it. - For example, to create a library for the ``bob.core`` package, it should be called ``bob.core.bob_core``. + For example, to create a library for the ``bob.myext`` package, it should be called ``bob.myext.bob_myext``. In this way it is assured that the libraries are found by the ``bob_packages`` parameter (see above). 2. All header files that your C++ library should export need to be placed in the directory ``bob/myext/include/bob.myext``. Again, this is the default directory, where the ``bob_packages`` expect the includes to be. + This is also the directory that is added to your own library and to your extensions, so you don't need to specify that by hand. -.. note:: - Please note that we import both the :py:class:`bob.extension.Library` and the :py:class:`bob.extension.build_ext` classes from ``bob.extension``. - When a :py:class:`bob.extension.Library` is inside the list of ``ext_modules``, the ``cmd_class = {'build_ext': build_ext}`` parameter to the ``setup.py`` is required to be added. +3. The include directory should contain a ``config.h`` file, which contains C/C++ preprocessor directives that contains the current version of your C/C++ API. + With this, we make sure that the version of the library that is linked into other packages is the expected one. + One such file is again given in our ``bob.example.library`` example. + +4. To avoid conflicts with other functions, you should put all your exported C++ functions into an appropriate namespace. + In our example, this should be something like ``bob::example::library``. The newly generated Library will be automatically linked to **all other** Extensions in the package. No worries, if the library is not used in the extension, the linker should be able to figure that out... @@ -300,11 +426,40 @@ No worries, if the library is not used in the extension, the linker should be ab .. note: The clang linker seems not to be smart enough to detect unused libraries... +You can also export your Python bindings to be used in other libraries. +Unfortunately, this is an extremely tedious process and is not explained in detail here. +As an example, you might want (or maybe not) to have a look into ``bob.blitz/bob/blitz/include/bob.blitz/capi.h``. + + +Using boost modules +=================== + +If your C++ code relies on boost packages, you might need to tell, which boost libraries you are using. +To enable one or several boost packages, the ``Extension`` and ``Library`` classes have a special set of +To use boost modules package at your ``setup.py`` file, you will also need the same trick as with ``pkgconfig``:: + + from setuptools import dist + dist.Distribution(dict(setup_requires='bob.extension')) + from bob.extension.boost import boost + +After inclusion, you can just instantiate an object of type ``boost``:: + + >>> boost_pkg = boost('>= 1.47') + >>> boost.version # doctest: SKIP + 1.50.0 + >>> boost.include_directory # doctest: SKIP + '/usr/include' + >>> libpaths, libnames = boost.libconfig(['system', 'python']) + >>> print(libpaths) # doctest: SKIP + ['/usr/lib'] + >>> print(libnames) # doctest: SKIP + ['boost_system-mt', 'boost_python-mt-py27'] + Compiling your Library and Extension ==================================== -To compile your C++ Python bindings and the pure C++ libraries, you can follow the same instructions as shown above: +As shown above, to compile your C++ Python bindings and the pure C++ libraries, you can follow the simple instructions: .. code-block:: sh @@ -332,21 +487,19 @@ Again, after compilation this directory can be safely removed. Another environment variable enables parallel compilation of C or C++ code. Use ``BOB_BUILD_PARALLEL=X`` (where x is the number of parallel processes you want) to enable parallel building. -.. warning:: This option is BETA and might not work on your system. - Documenting your C/C++ Python Extension ======================================= -One part of this package are some functions that makes it easy to generate a -proper python documentation for your bound C/C++ functions. This documentation -can be used after: +One part of this package are some functions that makes it easy to generate a proper python documentation for your bound C/C++ functions. +This documentation can be used after: .. code-block:: c++ #include <bob.extension/documentation.h> **Function documentation** +++++++++++++++++++++++++++ To generate a properly aligned function documentation, you can use: @@ -358,16 +511,11 @@ To generate a properly aligned function documentation, you can use: "Optional long function description" ); -.. note:: - - Please assure that you define this variable as ``static``. .. note:: - If you want to document a member function of a class, you should use set - fourth boolean option to true. This is required since the default python - class member documentation is indented four more spaces, which we need to - balance: + If you want to document a member function of a class, you should use set fourth boolean option to true. + This is required since the default python class member documentation is indented four more spaces, which we need to balance: .. code-block:: c++ @@ -378,27 +526,19 @@ To generate a properly aligned function documentation, you can use: true ); -Using this object, you can add several parts of the function that need -documentation: +Using this object, you can add several parts of the function that need documentation: -1. ``description.add_prototype("variable1, variable2", "return1, return2");`` - can be used to add function definitions (i.e., ways how to use your - function). This function needs to be called at least once. If the function - does not define a return value, it can be left out (in which case the - default ``"None"`` is used). +1. ``description.add_prototype("variable1, variable2", "return1, return2");`` can be used to add function definitions (i.e., ways how to use yourfunction). + This function needs to be called at least once. + If the function does not define a return value, it can be left out (in which case the default ``"None"`` is used). -2. ``description.add_parameter("variable1, variable2", "datatype", "Variable - description");`` should be defined for each variable that you have used in - the prototypes. +2. ``description.add_parameter("variable1, variable2", "datatype", "Variable description");`` should be defined for each variable that you have used in the prototypes. -3. ``description.add_return("return1", "datatype", "Return value - description");`` should be defined for each return value that you have used - in the prototypes. +3. ``description.add_return("return1", "datatype", "Return value description");`` should be defined for each return value that you have used in the prototypes. .. note:: - All these functions return a reference to the object, so that you can use - them in line, e.g.: + All these functions return a reference to the object, so that you can use them in line, e.g.: .. code-block:: c++ @@ -412,22 +552,16 @@ Finally, when binding you function, you can use: a. ``description.name()`` to get the name of the function -b. ``description.doc()`` to get the aligned documentation of the function, - properly indented and broken at 80 characters (by default). This call will - check that all parameters and return values are documented, and add a ``.. - todo`` directive if not. +b. ``description.doc()`` to get the aligned documentation of the function, properly indented and broken at 80 characters (by default). + This call will check that all parameters and return values are documented, and add a ``.. todo::`` directive if not. -Sphinx directives like ``.. note::``, ``.. warning::`` or ``.. math::`` will be -automatically detected and aligned, when they are used as one-line directive, -e.g.: +Sphinx directives like ``.. note::``, ``.. warning::`` or ``.. math::`` will be automatically detected and aligned, when they are used as one-line directive, e.g.: .. code-block:: c++ "(more text)\n\n.. note:: This is a note\n\n(more text)" -Also, enumerations and listings (using the ``*`` character to define a list -element) are handled automatically: - +Also, enumerations and listings (using the ``*`` character to define a list element) are handled automatically: .. code-block:: c++ @@ -435,20 +569,17 @@ element) are handled automatically: .. note:: - Please assure that directives are surrounded by double ``\n`` characters - (see example above) so that they are put as paragraphs. Otherwise, they - will not be displayed correctly. + Please assure that directives are surrounded by double ``\n`` characters (see example above) so that they are put as paragraphs. + Otherwise, they will not be displayed correctly. .. note:: The ``.. todo::`` directive seems not to like being broken at 80 characters. - If you want to use ``.. todo::``, please call, e.g., - ``description.doc(10000)`` to avoid line breaking. + If you want to use ``.. todo::``, please call, e.g., ``description.doc(10000)`` to avoid line breaking. .. note:: - To increase readability, you might want to split your documentation lines, - e.g.: + To increase readability, you might want to split your documentation lines, e.g.: .. code-block:: c++ @@ -459,102 +590,73 @@ element) are handled automatically: "\n" "(more text)" -Leading white-spaces in the documentation string are handled correctly, so you -can use several layers of indentation. +Leading white-spaces in the documentation string are handled correctly, so you can use several layers of indentation. **Class documentation** ++++++++++++++++++++++++ -To document a bound class, you can use the -``bob::extension::ClassDoc("class_name", "Short class description", "Optional -long class description")`` function to align and wrap your documentation. -Again, during binding you can use the functions ``description.name()`` and -``description.doc()`` as above. +To document a bound class, you can use the ``bob::extension::ClassDoc("class_name", "Short class description", "Optional long class description")`` function to align and wrap your documentation. +Again, during binding you can use the functions ``description.name()`` and ``description.doc()`` as above. -Additionally, the class documentation has a function to add constructor -definitions, which takes an ``bob::extension::FunctionDoc`` object. The -shortest way to get a proper class documentation is: +Additionally, the class documentation has a function to add constructor definitions, which takes an ``bob::extension::FunctionDoc`` object. +The shortest way to get a proper class documentation is: .. code-block:: c++ - static auto my_class_doc = - bob::extension::ClassDoc("class_name", "Short description", "Long Description") - .add_constructor( - bob::extension::FunctionDoc("class_name", "Constructor Description") - .add_prototype("param1", "") - .add_parameter("param1", "type1", "Description of param1") - ) + auto my_class_doc = + bob::extension::ClassDoc("class_name", "Short description", "Long Description") + .add_constructor( + bob::extension::FunctionDoc("class_name", "Constructor Description") + .add_prototype("param1", "") + .add_parameter("param1", "type1", "Description of param1") + ) ; .. note:: - The second parameter ``""`` in ``add_prototype`` prevents the output type - (which otherwise defaults to ``"None"``) to be written. + The second parameter ``""`` in ``add_prototype`` prevents the output type (which otherwise defaults to ``"None"``) to be written. .. note:: - For constructor documentations, there is no need to declare them as member - functions. This is done automatically for you. + For constructor documentations, there is no need to declare them as member functions. + This is done automatically for you. + +Currently, the ``ClassDoc`` allows to highlight member functions or variables at the beginning of the class documentation. +This highlighting is still under development and might not work as expected. -Currently, the ClassDoc allows to highlight member functions or variables at -the beginning of the class documentation. This highlighting is still under -development and might not work as expected. Possible speed issues ===================== -In order to speed up the loading time of the modules, you might want to reduce -the amount of documentation that is generated (though I haven't experienced any -speed differences). For this purpose, just compile your bindings using the -"-DBOB_SHORT_DOCSTRINGS" compiler option, e.g. by adding it to the setup.py as -follows (see also above): +In order to speed up the loading time of the modules, you might want to reduce the amount of documentation that is generated (though I haven't experienced any speed differences). +For this purpose, just compile your bindings using the ``"-DBOB_SHORT_DOCSTRINGS"`` compiler option, e.g. by simply define an environment variable ``BOB_SHORT_DOCSTRINGS=1`` before invoking ``buildout``. -.. code-block:: python +In any of these cases, only the short descriptions will be returned as the doc string. - ... - ext_modules=[ - Extension("bob.myext._myext", - [ - ... - ], - ... - define_macros = [('BOB_SHORT_DOCSTRINGS',1)], - ), - ], - ... - -or simply define an environment variable ``BOB_SHORT_DOCSTRINGS=1`` before -invoking buildout. - -In any of these cases, only the short descriptions will be returned as the doc -string. - -Document Generation and Unit Testing ------------------------------------- -If you intend to distribute your newly created package, please consider -carefully documenting and creating unit tests for your package. Documentation -is a great starting point for users and unit tests can be used to check -functionality in unexpected circumstances such as variations in package -versions. +Documentation Generation and Unit Testing +----------------------------------------- + +If you intend to distribute your newly created package, please consider carefully documenting and creating unit tests for your package. +Documentation is a great starting point for users and unit tests can be used to check functionality in unexpected circumstances such as variations in package versions. + Documentation ============= -To write documentation, use the `Sphinx`_ Document Generator. A template has -been setup for you under the ``docs`` directory. Get familiar with Sphinx and -then unleash the writer in you. +To write documentation, use the `Sphinx`_ Documentation Generator. +A template has been setup for you under the ``docs`` directory. +Get familiar with Sphinx and then unleash the writer in you. -Once you have edited both ``docs/conf.py`` and ``docs/index.rst`` you can run -the document generator executing: +Once you have edited both ``doc/conf.py`` and ``doc/index.rst`` you can run the documentation generator executing: .. code-block:: sh - $ ./bin/sphinx-build docs sphinx + $ ./bin/sphinx-build doc sphinx ... -This example generates the output of the sphinx processing in the directory -``sphinx``. You can find more options for ``sphinx-build`` using the ``-h`` -flag: +This example generates the output of the sphinx processing in the directory ``sphinx``. +You can find more options for ``sphinx-build`` using the ``-h`` flag: .. code-block:: sh @@ -563,139 +665,83 @@ flag: .. note:: - If the code you are distributing corresponds to the work described in a - publication, don't forget to mention it in your ``README.rst`` file. + If the code you are distributing corresponds to the work described in a publication, don't forget to mention it in your ``README.rst`` file. + Unit Tests ========== -Writing unit tests is an important asset on code that needs to run in different -platforms and a great way to make sure all is OK. Test units are run with -`nose`_. To run the test units on your package: +Writing unit tests is an important asset on code that needs to run in different platforms and a great way to make sure all is OK. +Test units are run with nose_. +To run the test units on your package call: .. code-block:: sh $ ./bin/nosetests -v - test_version (bob.example.test.MyTests) ... ok + bob.example.library.test.test_reverse ... ok ---------------------------------------------------------------------- - Ran 1 test in 0.001s + Ran 1 test in 0.253s OK -Creating Database Satellite Packages ------------------------------------- - -Database satellite packages are special satellite packages that can hook-in -|project|'s database manager ``bob_dbmanage.py``. Except for this detail, they -should look exactly like a normal package. - -To allow the database to be hooked to the ``bob_dbmanage.py`` you must -implement a non-virtual python class that inherits from -:py:class:`bob.db.driver.Interface`. Your concrete implementation should then -be described at the ``setup.py`` file with a special ``bob.db`` entry point: - -.. code-block:: python - - # bob database declaration - 'bob.db': [ - 'replay = bob.db.replay.driver:Interface', - ], - -At present, there is no formal design guide for databases. Nevertheless, it is -considered a good practice to follow the design of currently existing database -`satellite packages`_. This should ease migration in case of future changes. - -Python Package Namespace ------------------------- - -We like to make use of namespaces to define combined sets of functionality that -go well together. Python package namespaces are `explained in details here -<http://peak.telecommunity.com/DevCenter/setuptools#namespace-package>`_ -together with implementation details. Two basic namespaces are available when -you are operating with |project| or add-ons, such as database access APIs -(shipped separately): the ``bob`` namespace is reserved for utilities built and -shiped with |project|. The namespace ``bob`` (as for *external* |project| -packages) should be used for all other applications that are meant to be -distributed and augment |project|'s features. - -The example package you downloaded creates package inside the ``bob`` -namespace called ``example``. Examine this example in details and understand -how to distributed namespace'd packages in the URL above. - -In particular, if you are creating a database access API, please consider -putting all of your package contents *inside* the namespace -``bob.db.<package>``, therefore declaring two namespaces: ``bob`` and -``bob.db``. All standard database access APIs follow this strategy. Just look -at our currently existing database `satellite packages`_ for examples. - Distributing Your Work ---------------------- -To distribute a package, we recommend you use PyPI. The `The Hitchhiker’s Guide -to Packaging <http://guide.python-distribute.org/>`_ contains details and good -examples on how to achieve this. +To distribute a package, we recommend you use PyPI. +`The Hitchhiker’s Guide to Packaging <http://guide.python-distribute.org/>`_ contains details and good examples on how to achieve this. -Version Numbering Scheme ------------------------- -We recommend you follow |project|'s version numbering scheme using a 3-tier -string: ``M.m.p``. The value of ``M`` is a number starting at 1. This number is -changed in case of a major release that brings new APIs and concepts to the -table. The value of ``m`` is a number starting at 0 (zero). Every time a new -API is available (but no conceptual modifications are done to the platform) -that number is increased. Finally, the value of p represents the patch level, -starting at 0 (zero). Every time we need to post a new version of |project| -that does **not** bring incompatible API modifications, that number is -increased. For example, version 1.0.0 is the first release of |project|. +Version Numbering Scheme +======================== + +We recommend you follow |project|'s version numbering scheme using a 3-tier string: ``M.m.p``. +The value of ``M`` is a number starting at 1. +This number is changed in case of a major release that brings new APIs and concepts to the table. +The value of ``m`` is a number starting at 0. +Every time a new API is available (but no conceptual modifications are done to the platform) +that number is increased. +Finally, the value of p represents the patch level, starting at 0. +Every time we need to post a new version of |project| that does **not** bring incompatible API modifications, that number is increased. +For example, version 1.0.0 is the first release of |project|. Version 1.0.1 would be the first patch release. .. note:: - The numbering scheme for your package and |project|'s may look the same, but - should be totally independent of each other. |project| may be on version - 3.4.2 while your package, still compatible with that release could be on - 1.4.5. You should state on your ``setup.py`` file which version of |project| - your package is compatible with, using the standard notation defined for - setuptools installation requirements for packages. + The numbering scheme for your package and |project|'s may look the same, but should be totally independent of each other. + |project| may be on version 3.4.2 while your package, still compatible with that release could be on 1.4.5. + You should state on your ``setup.py`` file which version of |project| your package is compatible with, using the standard notation defined for setuptools installation requirements for packages. -You may use version number extenders for alpha, beta, and candidate releases -with the above scheme, by appending ``aN``, ``bN`` or ``cN`` to the version -number. The value of ``N`` should be an integer starting at zero. Python's -setuptools package will correctly classifier package versions following this -simple scheme. For more information on package numbers, consult Python's `PEP -386`_. Here are lists of valid python version numbers following this scheme:: +You may use version number extenders for alpha, beta, and candidate releases with the above scheme, by appending ``aN``, ``bN`` or ``cN`` to the version number. +The value of ``N`` should be an integer starting at zero. +Python's setuptools package will correctly classifier package versions following this simple scheme. +For more information on package numbers, consult Python's `PEP 386`_. +Here are lists of valid python version numbers following this scheme:: 0.0.1 0.1.0a35 1.2.3b44 2.4.99c32 + Release Methodology for Satellite Packages ------------------------------------------- - -Here is a set of steps we recommend you follow when releasing a new version of -your satellite package: - -1. First decide on the new version number your package will get. If you are - making a minor, API preserving, modification on an existing stable package - (already published on PyPI), just increment the last digit on the version. - Bigger changes may require that you signal them to users by changing the - first digits of the package. Alpha, beta or candidate releases don't need to - have their main components of the version changed, just bump-up the last - digit. For example ``1.0.3a3`` would become ``1.0.3a4``; - -2. In case you are making an API modification to your package, you should think - if you would like to branch your repository at this position. You don't have - to care about this detail with new packages, naturally. - - If required, branching will allow you to still make modifications (patches) - on the old version of the code and develop on the ``master`` branch for the - new release, in parallel. It is important to branch when you break - functionality on existing code - for example to reach compatibility with an - upcoming version of |project|. After a few major releases, your repository - should look somewhat like this:: +========================================== + +Here is a set of steps we recommend you follow when releasing a new version of your satellite package: + +1. First decide on the new version number your package will get. + If you are making a minor, API preserving, modification on an existing stable package (already published on PyPI), just increment the last digit on the version. + Bigger changes may require that you signal them to users by changing the first digits of the package. + Alpha, beta or candidate releases don't need to have their main components of the version changed, just bump-up the last digit. + For example ``1.0.3a3`` would become ``1.0.3a4``; + +2. In case you are making an API modification to your package, you should think if you would like to branch your repository at this position. + You don't have to care about this detail with new packages, naturally. + + If required, branching will allow you to still make modifications (patches) on the old version of the code and develop on the ``master`` branch for the new release, in parallel. + It is important to branch when you break functionality on existing code - for example to reach compatibility with an upcoming version of |project|. + After a few major releases, your repository should look somewhat like this:: ----> time @@ -712,42 +758,38 @@ your satellite package: +---x-------x-------> 1.0 The ``o``'s mark the points in which you decided to branch your project. - The ``x``'s mark places where you decided to release a new version of your - satellite package on PyPI. The ``-``'s mark commits on your repository. Time - flies from left to right. + The ``x``'s mark places where you decided to release a new version of your satellite package on PyPI. + The ``-``'s mark commits on your repository. + Time flies from left to right. - In this ficticious representation, the ``master`` branch continue under - development, but one can see older branches don't receive much attention - anymore. + In this ficticious representation, the ``master`` branch continue under development, but one can see older branches don't receive much attention anymore. - Here is an example for creating a branch at github (many of our satellite - packages are hosted there). Let's create a branch called ``1.1``:: + Here is an example for creating a branch at github (many of our satellite packages are hosted there). + Let's create a branch called ``1.1``:: - $ git branch 1.1 - $ git checkout 1.1 - $ git push origin 1.1 + $ git branch 1.1 + $ git checkout 1.1 + $ git push origin 1.1 -3. When you decide to release something publicly, we recommend you **tag** the - version of the package on your repository, so you have a marker to what code - you actually published on PyPI. Tagging on github would go like this:: +3. When you decide to release something publicly, we recommend you **tag** the version of the package on your repository, so you have a marker to what code you actually published on PyPI. + Tagging on github would go like this:: - $ git tag v1.1.0 - $ git push && git push --tags + $ git tag v1.1.0 + $ git push && git push --tags Notice use prefix tag names with ``v``. -4. Finally, after branching and tagging, it is time for you to publish your new - package on PyPI. When the package is ready and you have tested it, just do - the following:: +4. Finally, after branching and tagging, it is time for you to publish your new package on PyPI. + When the package is ready and you have tested it, just do the following:: - $ python setup.py register #if you modified your setup.py or README.rst - $ python setup.py sdist --formats=zip upload + $ python setup.py register #if you modified your setup.py or README.rst + $ python setup.py sdist --formats zip upload .. note:: - You can also check the .zip file that will be uploaded to PyPI before - actually uploading it. Just call:: + You can also check the .zip file that will be uploaded to PyPI before actually uploading it. + Just call:: - $ python setup.py sdist --formats=zip upload + $ python setup.py sdist --formats zip and check what was put into the ``dist`` directory. @@ -755,14 +797,10 @@ your satellite package: Upload Additional Documentation to PythonHosted.org ---------------------------------------------------- +=================================================== -In case you have written additional sphinx documentation in your satellite -package that you want to share with the world, there is an easy way to push the -documentation to `PythonHosted.org <http://pythonhosted.org>`_. More detailed -information are given `here -<http://pythonhosted.org/an_example_pypi_project/buildanduploadsphinx.html>`_, -which translates roughly into: +In case you have written additional sphinx documentation in your satellite package that you want to share with the world, there is an easy way to push the documentation to `PythonHosted.org <http://pythonhosted.org>`_. +More detailed information are given `here <http://pythonhosted.org/an_example_pypi_project/buildanduploadsphinx.html>`__, which translates roughly into: 1. Edit your setup.py and add the required package ``sphinx-pypi-upload``: @@ -790,23 +828,23 @@ which translates roughly into: [build_sphinx] source-dir = docs - build-dir = build/sphinx + build-dir = sphinx all_files = 1 [upload_sphinx] - upload-dir = build/sphinx/html + upload-dir = sphinx/html 3. Create and upload the documentation:: $ ./bin/python setup.py build_sphinx $ ./bin/python setup.py upload_sphinx -The link to the documentation will automatically be added to the PyPI page of -your package. Usually it is a good idea to check the documentation after -building and before uploading. +The link to the documentation will automatically be added to the PyPI page of your package. +Usually it is a good idea to check the documentation after building and before uploading. + Satellite Packages Available ----------------------------- +============================ Look here for our growing list of `Satellite Packages`_. diff --git a/doc/index.rst b/doc/index.rst index 719e59f..3925113 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -20,6 +20,7 @@ Documentation :maxdepth: 2 guide + cpp_api py_api Indices and tables diff --git a/doc/links.rst b/doc/links.rst index c40ae9b..4884a0e 100644 --- a/doc/links.rst +++ b/doc/links.rst @@ -5,6 +5,7 @@ .. Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland .. _bob's website: https://www.idiap.ch/software/bob +.. _bob: https://www.idiap.ch/software/bob .. _c++: http://www2.research.att.com/~bs/C++.html .. _distutils: http://docs.python.org/distutils/ .. _git: http://git-scm.com/ diff --git a/examples/bob.example.extension.tar.bz2 b/examples/bob.example.extension.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e77836864d0086140a3f640a03f57096d863ba39 GIT binary patch literal 22898 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 OlOhkD9N#^4aR2~^t7o_X literal 0 HcmV?d00001 diff --git a/examples/bob.example.library.tar.bz2 b/examples/bob.example.library.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5303ad10f44f65dc744d6cd61a1a4e8aeeaeaa95 GIT binary patch literal 23328 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%0DAPbqD)IbFF)B{+@k zt8<2E$L8|Pi7q0hQdw^&eac+!Y;xG=l56RdHk}Q3wdZgbYjwFedunKe9OQN4$h*7b zbfoY^x2;`4W}i%~gd?RF_)NUR#y|0{bd|ueol0wZ+7%2nT}8c06>Vz#H!tBl#I%^> z+dT)DrU`8ZGujVob9RcDv>ajDa6~mhNYO{=h-C4_X%>m6_I&bRy<f)dPj*MeLyx|G zg-B)nZf4i1pAt63-D$8?oM6GF^5eIEd(gt0lM4)0t@ejGST34m9lY(d&*w>kOHcLm z2}tb_U79m{*SXW7E0zWJo@bI}vz~QI<h<X-nM>oljz!9|rzH6{EPIx<&S|TGn89O~ z#!P`H&0UABeN<M=yfr5+rc!abWtqdpWj~vOGOP_wY47Qh$mBHK)a=%gazb@Nb%RHa z<!R<KkEiFo`Eb~9$*NA*Fk{0rr-k06WiJ1<;;~Vv-g1r;U96L@x=n1T>3+oTvoXm1 z>#d{P6Bh+fkoRhQ6kQguW$EV(rjNE}E{`0ZEULMf!`Pau>vSL`W$C?lp}!(T^CZ>s z&Mrue-^CI*K`d>-ZJ9OSIB%(C?7k9varZUJBQ{e+uO3o=w4gHoR!2(f2j#>o&z0uZ z+@4^!abicY2mgYD{w5CAPx_Dl`o-=3bcxxH(;0E>;r!)nA0D|s6j#1(@atXl5mt>@ zI}e_Y<&}8{bTmXCBnN$U-WAM~m^YXC{&rP%$0KjgO%96N&3A(}apL`aPr3d5<+IyU z;%$PZFL`|EU3m19m(Qa(hMcA=epW%&li8p8EA7{rRQ6BHKaP2^+(zZB1-F&IK0TSV zA+S)JnT?xs!-*wgrQaEDnj4?;&sUUd`u8KJEQ58K)^DYt$qXNlyfIwY_dCQ+qvSlx z=b!t&S)|^#*G$@c@Wi$c1;RPu@63IcosbP)Fq`>pl}3-K70*4%DPBicG)9SCJr%&? z@I!Iq4VP|~SufLD%md5rZrGx4{ON&5O3Tmri;J&p;p3?nzx!LbIAfv7q`!{u&!w1V zbFJ(#ekJ4?s`N|KXF<)M=8}j0_n*vJ*s#*|mye5q%-J7_Wv@d#-A>$jE-Tb6xlD1n zciTLL6FZ6or))_M@-pV0DNrBNda=bhLbgGD&;1mcgq+DvQ;dDO%5SZ^aN)hDxzUVZ z1=+c~VwW)ca-N#7p{*lp;Z;`Kja!1hna%rhqfmi$j?u3!=A3J+4%#ZW{GO~cQ*_%D z(ikA>@UcTo(Zo+Lxp&v`?87}}0xz6%t($kfdbi5*aF~edB$>LJV~2}OZnRlVzxgfw z_OBz(cZ6JBS|nM1xR~a8#{ACFcbVv}*wJvzspgFA{Eqhe_|tE8d$%51zxj67?#Txh z8?gA=+_m1lIM_%uLSce{#&P+yf)7^=^UlfgoZ^c!PJDDjU?bmY)|qj#@6R4M<Wcw2 zpjO%=PVPzAx@Q>@Dn~YDD?M4^Iqy(2!<E|?dMyPN=d(RXa?)dQ$W-HCNXnWu<3gs+ zQSZ(+L4{L3lM;)V`1Jbbr8a9H3k$5+bD{E4@$=%{Ax{?@i1JJm$(QV4*}3Rb??d+D z?x`$-e{42ymvZoIdcT~rNn6t3AbW=>ONXmgv$THNTtf@<AJ?v~l9|l4F<OE%bE!c> ziD!>XB-5k`f=ZQY#@b76t^YhXymM;Y&L=WY-E&tO-mQ_I9d)?wInQ>%E1@3`+DwdU zYTu?1;xch!Rp+{^zdSDTRfU+%K5{2OB(^H|Mbdko_BqPROm3DlU&!g|r=$igHF)c% z_W60c^vWi;lYfic91ABE_wfFEb@SEJgsb+vf(x`Se-6y8O1Sl%zx1l}|D$&%`iZF6 J8|z$l004w9G2;LL literal 0 HcmV?d00001 diff --git a/examples/bob.example.project.tar.bz2 b/examples/bob.example.project.tar.bz2 index 4269e2d06c3bfb1e6aa64a4e3bb791aa87c06504..7a1b686e0e92e1c74f9ce605d225e2cd3906f3da 100644 GIT binary patch delta 19572 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 delta 19700 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 Ozj%?WMZg5m@n!%53JyI0 diff --git a/setup.py b/setup.py index c92783c..7963503 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ from setuptools import setup, find_packages setup( name="bob.extension", - version="0.3.0a0", + version="2.0.0a0", description="Helps projects building Python/C++ extensions for Bob", url='http://github.com/bioidiap/bob.extension', license="BSD", @@ -32,6 +32,7 @@ setup( ], classifiers = [ + 'Framework :: Bob', 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', -- GitLab