[pp:metadata] implement format strings for 'directory' (#5728)
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user