Poetry: Support for custom commands and functions

Created on 28 Jun 2018  Â·  4Comments  Â·  Source: python-poetry/poetry

Hello,

When using setup.py, it is possible to customize commands or use functions to get some results dynamically.

For instance, to run a post install script (that requires dependencies to be installed) one can write this:

class CustomInstallCommand(install):
    def _post_install(self):
        # Some stuff to do

    def __init__(self, *args, **kwargs):
        super(CustomInstallCommand, self).__init__(*args, **kwargs)
        atexit.register(self._post_install)

and use this class as keyword argument value in the setup() call:

cmdclass={'install': CustomInstallCommand}

(other commands like clean, test, tox can be customized this way too).

Second example, in order to compile translation files (po files) into mo files at setup time:

def create_mo_files():
    data_files = []
    # do stuff
    return data_files

and use the result as keyword argument value in the setup() call:

data_files=create_mo_files()

It looks quite obvious that it's not possible to do such things if one uses only a pyproject.toml file: how would it import a class or a function, or know about it, how to run it? (Or is there a way?)

From reading the code, I've seen that the keyword arguments list passed to setup() is hard coded (to build a sdist), so cmdclass and data_files are not usable at the moment (if I'm not wrong).

I guess this is not the easiest feature to implement. Is it planned or already discussed?

Most helpful comment

I was just researching Poetry as one of possibilities for our new workflow and I bumped into this issue. Up until now, we've been using good old setup.py with several custom build cases:

  • compiling translation files .po → .mo (has already been mentioned)
  • compiling grpc protocol buffers to python modules
  • calling webpack to transpile and bundle the JavaScript code in our django apps

If Poetry doesn't plan to support these custom build steps, we could:

  1. add generated binary/minified files to our versioning system (ugh...)
  2. call these build steps manually (let's say from a Makefile) before running calling poetry build; unfortunately, that clashes with Poetry excluding files mentioned in .gitignore, but maybe there is a way around it; still, this way seems to be prone to errors (what if I forget to call them?), but kind of OK for the CI use i guess
  3. not use Poetry for the projects that require this (unfortunately, most of our projects requires at least the translations build step – so that would basically mean not using Poetry at all)

I really like Poetry and I thought it could be a solution to our current problems. But without these custom build steps, I'm afraid we won't be able to use it. @sdispater, do you think that there is any way around this? Any chance we could add a hook that would run before each call of poetry build (basically option 2 above, but without the manual component)? That wouldn't necessarily mean adding some executable files to Poetry itself, just being able to call a python function (or a shell script, but I'm much more inclined to Python callable). Or could this be somehow achieved by plugins?

All 4 comments

Just wanted to create this issue myself! (adding some keywords I was searching for here: post-install hook, post-install script). We can't write the code in pyproject.toml itself, but perhaps we could give a list of paths of scripts that should be run once install completes? This adds a lot to how you can customize the installation (e.g. poetry itself prompts to modify your path on install - could you do that when installing a project built with poetry?), but I think part of the argument for poetry over, e.g., setuptools + setup.py is to _not_ have arbitrary code execution at install. Would it be to much to have scripts that prompt to run at install? Then the user sees something like " is requesting to run

Related issues

Euphorbium picture Euphorbium  Â·  3Comments

etijskens picture etijskens  Â·  3Comments

alexlatchford picture alexlatchford  Â·  3Comments

sobolevn picture sobolevn  Â·  3Comments

nikaro picture nikaro  Â·  3Comments