[pp:metadata] implement format strings for 'directory' (#5728)

This commit is contained in:
Mike Fährmann
2024-07-06 01:01:54 +02:00
parent 8f3f061daf
commit da9916c01f
3 changed files with 33 additions and 3 deletions

View File

@@ -5442,11 +5442,13 @@ Description
metadata.directory metadata.directory
------------------ ------------------
Type Type
``string`` * ``string``
* ``list`` of ``strings``
Default Default
``"."`` ``"."``
Example Example
``"metadata"`` * ``"metadata"``
* ``["..", "metadata", "\fF {id // 500 * 500}"]``
Description Description
Directory where metadata files are stored in relative to the Directory where metadata files are stored in relative to the
current target location for file downloads. current target location for file downloads.

View File

@@ -56,7 +56,13 @@ class MetadataPP(PostProcessor):
ext = "json" ext = "json"
directory = options.get("directory") directory = options.get("directory")
if directory: if isinstance(directory, list):
self._directory = self._directory_format
self._directory_formatters = [
formatter.parse(dirfmt, util.NONE).format_map
for dirfmt in directory
]
elif directory:
self._directory = self._directory_custom self._directory = self._directory_custom
sep = os.sep + (os.altsep or "") sep = os.sep + (os.altsep or "")
self._metadir = util.expand_path(directory).rstrip(sep) + os.sep self._metadir = util.expand_path(directory).rstrip(sep) + os.sep
@@ -147,6 +153,16 @@ class MetadataPP(PostProcessor):
def _directory_custom(self, pathfmt): def _directory_custom(self, pathfmt):
return os.path.join(pathfmt.realdirectory, self._metadir) return os.path.join(pathfmt.realdirectory, self._metadir)
def _directory_format(self, pathfmt):
formatters = pathfmt.directory_formatters
try:
pathfmt.directory_formatters = self._directory_formatters
segments = pathfmt.build_directory(pathfmt.kwdict)
directory = pathfmt.clean_path(os.sep.join(segments) + os.sep)
return os.path.join(pathfmt.realdirectory, directory)
finally:
pathfmt.directory_formatters = formatters
def _filename(self, pathfmt): def _filename(self, pathfmt):
return (pathfmt.filename or "metadata") + "." + self.extension return (pathfmt.filename or "metadata") + "." + self.extension

View File

@@ -440,6 +440,18 @@ class MetadataTest(BasePostprocessorTest):
path = self.pathfmt.realdirectory + "metadata/file.json" path = self.pathfmt.realdirectory + "metadata/file.json"
m.assert_called_once_with(path, "w", encoding="utf-8") m.assert_called_once_with(path, "w", encoding="utf-8")
def test_metadata_directory_format(self):
self._create(
{"directory": ["..", "json", "\fF {id // 500 * 500 + 500}"]},
{"id": 12345},
)
with patch("builtins.open", mock_open()) as m:
self._trigger()
path = self.pathfmt.realdirectory + "../json/12500/file.ext.json"
m.assert_called_once_with(path, "w", encoding="utf-8")
def test_metadata_filename(self): def test_metadata_filename(self):
self._create({ self._create({
"filename" : "{category}_{filename}_/meta/\n\r.data", "filename" : "{category}_{filename}_/meta/\n\r.data",