babel icon indicating copy to clipboard operation
babel copied to clipboard

option --init-missing of `pybabel update` should also create the corresponding directory

Open du33169 opened this issue 1 year ago • 4 comments

I use the option --init-missing of pybabel update to avoid redundant pybabel init command. However, this option only creates the *.po file, and will fail if the target directory ([locale]/LC_MESSAGES) does not exist yet:

creating catalog .\en_US\LC_MESSAGES\strings.po based on strings.pot
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "...\.venv\Scripts\pybabel.exe\__main__.py", line 8, in <module>
  File "...\.venv\Lib\site-packages\babel\messages\frontend.py", line 999, in main
    return CommandLineInterface().run(sys.argv)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "...\.venv\Lib\site-packages\babel\messages\frontend.py", line 925, in run
    return cmdinst.run()
           ^^^^^^^^^^^^^
  File "...\.venv\Lib\site-packages\babel\messages\frontend.py", line 795, in run
    with open(filename, 'wb') as outfile:
         ^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '.\\en_US\\LC_MESSAGES\\strings.po'

This behavior makes the option less useful. I suggest invoke os.makedirs in UpdateCatalog.finalize_options, just like in InitCatalog.finalize_options: https://github.com/python-babel/babel/blob/f91754b01cb9f32b83aeaa80b74ed10b5dfccb6a/babel/messages/frontend.py#L629-L630 but with extra exist_ok=True argument, as the directory may already exist for the update command.

Or it might be better to reuse the logic in InitCatalog.

du33169 avatar Oct 17 '24 06:10 du33169

Makes sense! If you feel like writing a PR, that would be appreciated.

akx avatar Oct 19 '24 12:10 akx

I'll look into it, but it will be a few days before I'm free. If you or anyone else is interested and can nail it, please go ahead.

du33169 avatar Oct 22 '24 17:10 du33169

Hmm – I'm actually unable to repro this 🤔

~/b/babel $ pybabel update --init-missing -i tests/messages/data/project/i18n/messages.pot -d $(mktemp -d) -l en_US
creating catalog /var/folders/nz/6mg9yzdj1kq8lg2tsc5y9rlc0000gn/T/tmp.gNcQgcfVyp/en_US/LC_MESSAGES/messages.po based on tests/messages/data/project/i18n/messages.pot
updating catalog /var/folders/nz/6mg9yzdj1kq8lg2tsc5y9rlc0000gn/T/tmp.gNcQgcfVyp/en_US/LC_MESSAGES/messages.po based on tests/messages/data/project/i18n/messages.pot

akx avatar Jan 13 '25 12:01 akx

It still occurs for me with Babel v2.16.0 and Python 3.11. Here's what I did:

#git clone https://github.com/python-babel/babel.git
mkdir test_babel
cd test_babel
cp ../babel/tests/messages/data/project/i18n/messages.pot ./
python -m venv .venv
source .venv/bin/activate
pip install babel
pybabel update --init-missing -i messages.pot -d $(mktemp -d) -l en_US

And the output: log.txt

du33169 avatar Jan 13 '25 15:01 du33169