Old changes in atelier


inv release failed because PyPI has a new limit of 1 second between each api call. Fixed this using the RateLimitedServerProxy posted by evgeni on https://github.com/pypa/warehouse/issues/8753


Fix pp -l fails when a repo has HEAD detached.


Misc changes.

Released Atelier 1.1.24 to PyPI (and bugfix release 1.1.25 a bit later).


Optimized the yearly blog index (blogger_year directive) : add the date before the “All entries” list. Have them sorted newest first. No navigator when there is only one year.


Fixed a bug that caused rstgen.sphinxconf.blog to fail collecting multiple blog entries of a same day in some cases. You can now have two files 0408.rst and 0408b.rst and atelier will collect them correctly. The calendar link will point to the first one.


rstgen.sphinxconf.configure() now installs sphinx_rtd_style as theme.


Remove tox from install_requires in favor of standart tesing using unittest.

Released version 1.1.23


Changed default of test_command to “python -m unittest discover -s tests”.


atelier.invlib.tasks now changes the current working directory to the project’s root_dir before launching test_command.


(canceled on 20191122) When a tox.ini file exists, the inv test command now sets an environment variable REQ_VERSION to the value “local” when calling tox.

We realized that Atelier must not use tox. Atelier is meant to run within one virtual environment, tox is being used “outside” of atelier. New


(canceled on 20191122) The command inv cov now runs inv test before actually running the coverage.

Released version 1.1.22


Released version 1.1.20 Released version 1.1.21


(canceled on 20191122) inv test now simply calls tox if a file tox.ini exists. To use the new way of testing, existing projects should:

  • add a tox.ini file

  • rename __init__.py to test_everything.py

  • Add .tox to the .gitignore file.


Released version 1.1.19


rstgen.sphinxconf.interproject.configure() now supports intersphinx links to pure documentation projects.


rstgen.sphinxconf.interproject.configure() didn’t collect the intersphinx_mapping for packages that had an intersphinx_urls but were installed via PyPI.

Add sphinx to the install_requires.

Released version 1.1.17 and then 1.1.18


When building the doc, raise an clear exception if we can’t import the required package.

Released version 1.1.16.


When you instantiate a atelier.sheller.Sheller without specifying a directory, it now creates a temporary directory and all processes run there. Until now they ran in the current working directory, which is pretty unpredictable.

Released version 1.1.15.


We have now two config settings for inv prep: prep_command and demo_prep_command. demo_prep_command is what prep_command was until now (i.e. a command to run in every demo project). prep_command (default empty) is now a command to run in the project’s root directory. First use case is getlino. Both settings are meant to be customized in the projects tasks.py file.

Released version 1.1.14.


The pp -l command no longer shows the doctrees. If you want to see them, change SHOW_DOCTREES in atelier.projects to True. Showing the doctrees causes the command to need about 7 seconds instead of one second (in my environment) because it also imports the conf.py file of every doctree.


Renamed `inv configure to inv install


The default value for the editor_command setting is now taken from the EDITOR environment variable.


Added a new command inv configure (which later became inv install).

Released version 1.1.13.


The inv release command no longer creates a version branch by default. If you want a branch, you must now say --branch.


Added support for multilingual Sphinx sites. When the conf.py file of a Sphinx doctree defines a variable translated_languages (which is expected to be a list of language codes), then inv mm and inv bd now act accordingly. This works only if you previously did pip install sphinx-intl. You should add yourself interlanguage links. The simplest way is to write a template languages.html and add it to your html_sidebars.


  • per_project -l now shows the title of each doctree

  • interproject no longer stops loading after current project when no explicit project list is given.


Fixed a bug in atelier.sphinxcontrib.interproject which caused it to not correctly set intersphinx_mapping when local builds are being used. Intersphinx data in builds of other local projects is now being used by default if it exists. To simulate the situation on Travis where they never exist, set an environment variable ATELIER_IGNORE_LOCAL_BUILDS to the string “yes”.


The notag option of inv release was renamed to nobranch.


Added a --reverse option to pp.

You can now run a command in all projects in the reversed order of what is defined in your ~/.atelier/config.py.

This is important if you maintain several projects whose docs use intersphinx to refer to each other. In such a context you will use the --reverse option for commands like inv bd and inv pd. You can then run a full pp tour as follows:

$ pp -rv inv clean -b bd pd
$ pp inv prep test

Rule of thumb : project a must come before project b if

  • code in a requires code in b to be installed

  • docs in a require intersphinx references to docs of b

Version 1.1.12 (released 2018-11-24)

(20181124) The intersphinx_urls can now be specified in tasks.py for projects without a main_module.

Version 1.1.11 (released 2018-11-05)

(20181105) changed the syntax of demo_projects: instead of specifying paths (relative to the project’s root_dir) we now specify them as Python modules.

(20181102) added an option –only (or -o) to inv bd and inv pd because in book we have now already 4 doctrees and sometimes you might want to build only one of them.

Version 1.1.10 (released 2018-10-29)

(20181029) The inv release command now creates a branch instead of a tag (#2599 ).

Version 1.1.9 (released 2018-09-19)

(20180901) : The inv release command now also pushes the version tag. Tag creation can be skipped by specifying the new argument --notag.

(20180821) Added support for Sphinx version is 1.8 or later. rstgen.sphinxconf.configure() now checks the Sphinx version and sets the new autodoc_default_options configuration value instead of the deprecated autodoc_default_flags (if Sphinx is 1.8 or newer).

The inv clean command now also removes .eggs directories and __pycache__ directories.

The DjangoTemplateBridge from rstgen.sphinxconf was not used and has been removed.

(20180806) : The context variable {prj} in sdist_dir must not be the project_name but SETUP_INFO['name'].

(20180803) : sdist_dir now supports a string template with a single context variable: {prj} will be replaced by the project_name

atelier.invlib.tasks.show_pypi_status() has a new optional argument severe. Default value is True (same behaviour as before), but the inv sdist command now calls with severe=False.

(20180521) Bugfix: When the ~/.atelier/config.py file contained an invalid project name (i.e. it calls atelier.projects.add_project() with a root_dir that doesn’t exist), the project was being added to the list, but pp -l failed:

AttributeError: 'NoneType' object has no attribute 'configuration'

Now this configuration error will already raise an exception when reading the ~/.atelier/config.py file, making it easier to localize.

Version 1.1.8 (released 2018-05-21)

(20180510) get_project_from_module didn’t yet work in environments without a local config.py file. Such projects have neither a tasks.py file not a setup.py file, but at least they have a main_package (and that’s what intersphinx needs). This fixes #2385 (intersphinx does not find the objects.inv for Atelier on Travis).

Version 1.1.7 (released 2018-05-04)

More internal optimizations. Fixed a bug which caused problems in per_project with reading the configuration.

Version 1.1.6 (released 2018-05-02)

The test suite generated by atelier.test.make_docs_suite() is now sorted alphabeticallly in order to avoid surprises when some doctest inadvertantly modifies a demo database or some other condition.

Fixed a bug in per_project: commands starting with git (e.g. pp git st) would fail with a traceback.

More internal optimizations, e.g. the config of a project now always has all keys.

Version 1.1.5 (released 2018-04-30)

Fixes some bugs that caused failures when building docs on Travis. Versions 1.1.0 through 1.1.4 were beta previews for this.

Backwards-incompatible new syntax for tasks.py files:


from atelier.invlib.ns import ns
ns.setup_from_tasks(globals(), ...)


from atelier.invlib import setup_from_tasks
ns = setup_from_tasks(globals(), ...)

Version 1.0.14 (released 2018-03-15)

  • New function atelier.utils.isidentifier()

Version 1.0.13 (released 2017-12-17)

Better support for Python 2-3 compatible doctests:

  • Added a new function atelier.utils.sixprint().

  • atelier.utils.rmu() now honors Mike Orr’s pathlib.Path objects which happen to print differently under Python 3.

Version 1.0.12 (released 2017-10-11)

New optional parameter addenv for atelier.test.make_docs_suite().

Version 1.0.11 (released 2017-09-26)

Better Python 3 support and increased test coverage.

Version 1.0.10 (released 2017-09-22)

Version 1.0.9 wasn’t enough: the default value for prep_command also needs to use sys.executable.

Version 1.0.9 (released 2017-09-22)

Several tasks in atelier.invlib used to call hard-coded python, but on certain CI environments the Python executable has another name. Replaced by sys.executable.

Version 1.0.8 (released 2017-09-20)

Changed configuration API for demo_projects: I moved the definition of demo_projects from Lino to atelier.invlib and changed the syntax: the itema of demo_projects must now be directory names (and no longer names of Django settings modules).

Version 1.0.7 (released 2017-09-12)

DocTestCase removes PYTHONPATH from environment. Fixes #1296.

Version 1.0.6 (released 2017-06-07)

New functions atelier.utils.isiterable() and atelier.utils.is_string().

Version 1.0.5 (released 2017-02-16)

  • Fixes some Python 3 issues.

Version 1.0.4 (released 2016-10-26)

  • A minor but backwards-incompatible optimization of the modules below atelier.invlib requires changes in the tasks.py file of every project which uses Atelier.

Version 1.0.3 (released 2016-08-31)

  • The inv ls command has been replaced by a --list option to per_project. (2016-08-14)

  • inv sdist now creates the archive file directly in sdist_dir and no longer in a subdir thereof (using the project name).

  • Worked on inv cov.

Version 1.0.2 (released 2016-07-16)

  • Fixes TypeError: setup_from_tasks() got an unexpected keyword argument 'demo_projects'. Thanks to Grigorij for reporting the problem.

Version 1.0.1 (released 2016-06-19)

Version 1.0.0 (released 2016-03-25)

Version 0.0.20 (released 2016-03-24)

  • Most fab commands now work as inv.

  • Fixed a bug which caused TypeError: object.__new__(NotImplementedType) is not safe, use NotImplementedType.__new__()

Version 0.0.19 (released 2016-03-08)

  • New functions atelier.utils.dict_py2(), atelier.utils.list_py2() and atelier.utils.tuple_py2() are required for Lino’s test suite.

Version 0.0.18 (released 2016-03-04)

  • New function atelier.utils.last_day_of_month().

Version 0.0.17 (released 2016-02-15)

  • Subtle change in docs_rsync_dest: until now it was not possible to specify a template without any placeholder (as the one in the example on https://github.com/lsaffre/dblog)

  • Started to replace fabric by invoke. This is not finished. For the moment you should continue to use the fab commands. But soon they will be replaced by inv commands.

Version 0.0.16 (released 2015-12-04)

  • atelier.fablib no longer tries to import django.utils.importlib. (Dropped support for Python 2.6)

  • Fixed #553. The fab bd command failed to call load_fabfile when trying to write the README.rst file. This didn’t disturb anybody until now because I have a ~/.atelier/config.py file (and when you have such a file, all projects are automatically loaded, including load_fabfile.

  • Fixed #533. fab bd failed when the repository was in a directory using a symbolic link because Python got hassled when importing the main module. atelier.projects now resolves the project_dir.

Version 0.0.15 (released 2015-06-10)

New setting atelier.fablib.env.locale_dir. Until now fab mm always wrote the locale files into a subdirectory of the main module. Now a project can specify an arbitrary location. This was necessary for Django 1.7 where you cannot have plugins named foo.modlib.bar if you also have a plugin whose full name is foo (2015-04-27)

New function atelier.rstgen.attrtable.

Version 0.0.14 (released 2015-03-15)

Importing atelier now automatically adds a codecs writer to sys.stdout. As a consequence, atelier.doctest_utf8 is no longer needed.

Version 0.0.13 (released 2015-02-14)

Fixed a bug in atelier.test.TestCase.run_subprocess() which could cause a subprocess to deadlock when it generated more output than the OS pipe buffer would swallow.

JarBuilder is now in a separate module, the usage API is slightly changed. Signing with a timestamp is now optional, and the URL of the TSA can be configured.

Version 0.0.12 (released 2015-02-02)

Getting Lino to build on Travis CI. Once again I changed the whole system of declaring demo projects. The parameter to atelier.fablib.add_demo_project() must be a Django settings module, it cannot be a path. And atelier.fablib.run_in_demo_projects() must set the current working directory to the site_dir, not the project_dir.

Version 0.0.11 (released 2015-01-29)

  • Users of atelier.fablib who used “demo databases” (which we now call “Django demo projects”, see atelier.fablib.env.demo_projects) must adapt their fabfile.py as described in 2015-01-29.

  • New configuration setting atelier.fablib.env.editor_command.

Version 0.0.10 (released 2014-12-29)

Fixes a problem for generating the calendar view of a blogger_year: the cell for December 29, 2014 was not clickable even when a blog entry existed.

Version 0.0.9 (released 2014-12-26)

  • fab blog failed when the user had only VISUAL but not EDITOR set (2014-12-27).

  • fab blog failed when the directory for the current year didn’t yet exist. Now it automatically wishes “Happy New Year”, creates both the directory and the default index.rst file for that year.

  • Removed (source scripts/shotwell2blog.py) which has now its own repository.

  • (source scripts/per_project) no longer stumbles over projects whose revision_control_system is None.

Version 0.0.8 (released 2014-12-26)

  • fab_commands can now be invoked from a subdirectory of the project’s root. And atelier.projects now supports to work in undeclared projects even if there is a config.py file. (2014-12-26)

  • New method shell_block.

  • fab docs renamed to fab bd, fab pub renamed to fab pd

Version 0.0.7 (released 2014-12-22)

This is a bugfix release for 0.0.6 which fixes one bug:

[localhost] local: git tag -a 0.0.6 -m Release atelier 0.0.6.
fatal: too many params

Version 0.0.6 (released 2014-12-22)

  • The fab release now also does git tag.

  • The fab release command now reminds me of the things to check before a release, communicates with PyPI and displays information about the last official release.

  • Improved the documentation.

Version 0.0.5 (released 20141207)

Version 0.0.3

  • Fixed AttributeError: work_root occuring when there was no work_root in user’s .fabricrc file. The work_root env setting is no longer used.

  • (2014-01-17) atelier now supports namespace packages (and thus the fab summary fablib command no longer prints “old” and “new” version because that would require the Distribution object (returned from pkg_resources.get_distribution) which afaics makes problems for namespace packages.

  • (2013-06-23) atelier.test.TestCase.run_simple_doctests() didn’t yet support non-ascii characters.

    Now it does. Had to add a new module atelier.doctest_utf8 for this. Because we need to run each doctest in a separate subprocess and because the command-line interface of python -m doctest has no way to specify an encoding of the input file.

  • rstgen.sphinxconf.configure() now automatically adds the intersphinx entries for projects managed in this atelier.

  • The PROJECTS variable in /etc/atelier/config.py is now a list of importable Python module names, and their local path will be automatically extracted. No longer necessary to define a PROJECTS_HOME

  • per_project no longer inserts “fab” as first command.

  • Renamed atelier.test.SubProcessTestCase to atelier.test.TestCase. Moved Django-specific methods away to a new module djangosite.utils.pythontest.

Version 0.0.2 (released 2013-05-05)

  • atelier.test.SubProcessTestCase.run_docs_doctests now activates the Site’s default language for each testcase (when north is available)

Version 0.0.1 (released 2013-04-22)