298 lines
9.8 KiB
Python
298 lines
9.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright 2025 Mike Fährmann
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
|
|
import os
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
from gallery_dl import path, extractor, config # noqa E402
|
|
|
|
KWDICT = {
|
|
"category" : "test",
|
|
"filename" : "file",
|
|
"extension": "ext",
|
|
"name" : "test-テスト-'&>-/:~",
|
|
"ext" : "txt",
|
|
"foo" : "bar",
|
|
"id" : 123,
|
|
}
|
|
|
|
|
|
class TestPath(unittest.TestCase):
|
|
|
|
def _pfmt(self, data={}, kwdict=False, extr=extractor.find("noop")):
|
|
pathfmt = path.PathFormat(extr)
|
|
|
|
if kwdict:
|
|
pathfmt.set_directory({
|
|
**(kwdict if isinstance(kwdict, dict) else KWDICT),
|
|
**data,
|
|
})
|
|
|
|
return pathfmt
|
|
|
|
def setUp(self):
|
|
config.clear()
|
|
path.WINDOWS = False
|
|
|
|
|
|
class TestPathObject(TestPath):
|
|
|
|
def test_default(self):
|
|
pfmt = self._pfmt()
|
|
|
|
self.assertEqual(pfmt.kwdict, {})
|
|
self.assertEqual(pfmt.delete, False)
|
|
self.assertEqual(pfmt.filename, "")
|
|
self.assertEqual(pfmt.extension, "")
|
|
self.assertEqual(pfmt.directory, "")
|
|
self.assertEqual(pfmt.realdirectory, "")
|
|
self.assertEqual(pfmt.path, "")
|
|
self.assertEqual(pfmt.realpath, "")
|
|
self.assertEqual(pfmt.temppath, "")
|
|
self.assertEqual(pfmt.basedirectory, "./gallery-dl/")
|
|
self.assertEqual(pfmt.strip, "")
|
|
|
|
self.assertIs(pfmt.filename_conditions, None)
|
|
self.assertIs(pfmt.directory_conditions, None)
|
|
|
|
self.assertTrue(callable(pfmt.extension_map))
|
|
self.assertTrue(callable(pfmt.extension_map))
|
|
self.assertTrue(callable(pfmt.extension_map))
|
|
self.assertTrue(callable(pfmt.clean_segment))
|
|
self.assertTrue(callable(pfmt.clean_path))
|
|
|
|
self.assertTrue(callable(pfmt.filename_formatter))
|
|
for fmt in pfmt.directory_formatters:
|
|
self.assertTrue(callable(fmt))
|
|
|
|
def test_str(self):
|
|
pfmt = self._pfmt()
|
|
self.assertEqual(str(pfmt), pfmt.realdirectory)
|
|
self.assertEqual(str(pfmt), "")
|
|
|
|
pfmt = self._pfmt()
|
|
pfmt.set_directory(KWDICT)
|
|
pfmt.set_filename(KWDICT)
|
|
pfmt.build_path()
|
|
self.assertEqual(str(pfmt), pfmt.realpath)
|
|
self.assertEqual(str(pfmt), "./gallery-dl/test/file.ext")
|
|
|
|
|
|
class TestPathOptions(TestPath):
|
|
|
|
def test_option_filename(self):
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname , "file.ext")
|
|
|
|
config.set((), "filename", "foo.{foo}")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "foo.bar")
|
|
|
|
config.set((), "filename", {
|
|
"foo == 'baz'": "foo",
|
|
"id % 2" : "bar",
|
|
"" : "baz",
|
|
})
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "bar")
|
|
|
|
def test_option_directory(self):
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.directory , "./gallery-dl/test/")
|
|
self.assertEqual(pfmt.realdirectory, "./gallery-dl/test/")
|
|
|
|
config.set((), "directory", ["{foo}", "bar"])
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.directory , "./gallery-dl/bar/bar/")
|
|
self.assertEqual(pfmt.realdirectory, "./gallery-dl/bar/bar/")
|
|
|
|
config.set((), "directory", {
|
|
"foo == 'baz'": ["a", "b", "c"],
|
|
"id % 2" : ["odd", "{id}"],
|
|
"" : ["{foo}", "bar"],
|
|
})
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.directory , "./gallery-dl/odd/123/")
|
|
self.assertEqual(pfmt.realdirectory, "./gallery-dl/odd/123/")
|
|
|
|
def test_option_basedirectory(self):
|
|
config.set((), "base-directory", "{foo}")
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.realdirectory, "{foo}/test/")
|
|
|
|
config.set((), "base-directory", {
|
|
"foo == 'baz'": "bar",
|
|
"id % 2" : "./odd",
|
|
"" : "./default",
|
|
})
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.realdirectory, "./odd/test/")
|
|
|
|
def test_option_keywordsdefault(self):
|
|
config.set((), "directory", ["{baz}"])
|
|
config.set((), "base-directory", "")
|
|
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.realdirectory, "None/")
|
|
|
|
config.set((), "keywords-default", "ND")
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.realdirectory, "ND/")
|
|
|
|
config.set((), "keywords-default", "")
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(pfmt.realdirectory, "")
|
|
|
|
def test_option_extensionmap_default(self):
|
|
kwdict = KWDICT.copy()
|
|
pfmt = self._pfmt()
|
|
pfmt.set_filename(kwdict)
|
|
self.assertEqual(pfmt.extension, "ext")
|
|
|
|
pfmt.set_extension("jpg")
|
|
self.assertEqual(pfmt.extension, "jpg")
|
|
self.assertEqual(kwdict["extension"], "jpg")
|
|
|
|
pfmt.set_extension("png")
|
|
self.assertEqual(pfmt.extension, "png")
|
|
self.assertEqual(kwdict["extension"], "png")
|
|
|
|
pfmt.set_extension("jpeg")
|
|
self.assertEqual(pfmt.extension, "jpg")
|
|
self.assertEqual(kwdict["extension"], "jpg")
|
|
|
|
for ext, repl in path.EXTENSION_MAP.items():
|
|
pfmt.set_extension(ext)
|
|
self.assertEqual(pfmt.extension, repl)
|
|
self.assertEqual(kwdict["extension"], repl)
|
|
|
|
def test_option_extensionmap_custom(self):
|
|
extmap = {
|
|
"bitmap": "bmp",
|
|
"ping" : "png",
|
|
"jiff" : "gif",
|
|
}
|
|
config.set((), "extension-map", extmap)
|
|
|
|
kwdict = KWDICT.copy()
|
|
pfmt = self._pfmt()
|
|
pfmt.set_filename(kwdict)
|
|
|
|
pfmt.set_extension("jpg")
|
|
self.assertEqual(pfmt.extension, "jpg")
|
|
self.assertEqual(kwdict["extension"], "jpg")
|
|
|
|
pfmt.set_extension("ping")
|
|
self.assertEqual(pfmt.extension, "png")
|
|
self.assertEqual(kwdict["extension"], "png")
|
|
|
|
for ext, repl in extmap.items():
|
|
pfmt.set_extension(ext)
|
|
self.assertEqual(pfmt.extension, repl)
|
|
self.assertEqual(kwdict["extension"], repl)
|
|
|
|
for ext, repl in path.EXTENSION_MAP.items():
|
|
pfmt.set_extension(ext)
|
|
self.assertNotEqual(pfmt.extension, repl)
|
|
self.assertNotEqual(kwdict["extension"], repl)
|
|
|
|
def test_option_pathrestrict(self):
|
|
config.set((), "filename", "{name}.{ext}")
|
|
|
|
config.set((), "path-restrict", "unix")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "test-テスト-'&>-_:~.txt", "unix")
|
|
|
|
config.set((), "path-restrict", "windows")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "test-テスト-'&_-__~.txt", "windows")
|
|
|
|
config.set((), "path-restrict", "ascii")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "test____________.txt", "ascii")
|
|
|
|
config.set((), "path-restrict", "ascii+")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "test-___-'&_-__~.txt", "ascii+")
|
|
|
|
def test_option_pathrestrict_custom(self):
|
|
config.set((), "filename", "{name}.{ext}")
|
|
|
|
config.set((), "path-restrict", "ts-")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "_e___テスト_'&>_/:~._x_", "custom str")
|
|
|
|
config.set((), "path-restrict", {
|
|
"t": "A",
|
|
"s": "B",
|
|
"-": "###",
|
|
"/": "|"
|
|
})
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "AeBA###テスト###'&>###|:~.AxA", "custom dict")
|
|
|
|
config.set((), "path-restrict", {
|
|
"a-z": "x",
|
|
"テ": "te",
|
|
"ス": "su",
|
|
"ト": "to",
|
|
})
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "xxxx-tesuto-'&>-/:~.xxx", "custom dict range")
|
|
|
|
def test_option_pathreplace(self):
|
|
config.set((), "filename", "{name}.{ext}")
|
|
|
|
config.set((), "path-restrict", "unix")
|
|
config.set((), "path-replace", "&")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "test-テスト-'&>-&:~.txt", "&")
|
|
|
|
config.set((), "path-restrict", "windows")
|
|
config.set((), "path-replace", "***")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "test-テスト-'&***-******~.txt", "***")
|
|
|
|
def test_option_pathremove(self):
|
|
config.set((), "filename", "{name}.{ext}")
|
|
|
|
config.set((), "path-remove", "-&/")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "testテスト'>_:~.txt")
|
|
|
|
config.set((), "path-remove", "a-z0-9")
|
|
fname = self._pfmt().build_filename(KWDICT)
|
|
self.assertEqual(fname, "-テスト-'&>-_:~.")
|
|
|
|
def test_option_pathstrip(self):
|
|
config.set((), "directory", [" . {name}.{ext} . "])
|
|
config.set((), "base-directory", "")
|
|
config.set((), "path-restrict", "unix")
|
|
|
|
config.set((), "path-strip", "unix")
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(
|
|
pfmt.realdirectory, ". test-テスト-'&>-_:~.txt ./", "unix")
|
|
|
|
config.set((), "path-strip", "windows")
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(
|
|
pfmt.realdirectory, ". test-テスト-'&>-_:~.txt/", "windows")
|
|
|
|
config.set((), "path-strip", "txt")
|
|
pfmt = self._pfmt(kwdict=True)
|
|
self.assertEqual(
|
|
pfmt.realdirectory, ". test-テスト-'&>-_:~.txt ./", "custom")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|