option --init-missing of `pybabel update` should also create the corresponding directory
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.
Makes sense! If you feel like writing a PR, that would be appreciated.
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.
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
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