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

pull/5870/head
Mike Fährmann 3 months ago
parent 8f3f061daf
commit da9916c01f
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

@ -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.

@ -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

@ -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",

Loading…
Cancel
Save