Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mikf
GitHub Repository: mikf/gallery-dl
Path: blob/master/test/test_path.py
8753 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
# Copyright 2025 Mike Fährmann
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License version 2 as
8
# published by the Free Software Foundation.
9
10
import os
11
import sys
12
import unittest
13
14
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15
from gallery_dl import path, extractor, config # noqa E402
16
17
KWDICT = {
18
"category" : "test",
19
"filename" : "file",
20
"extension": "ext",
21
"name" : "test-テスト-'&>-/:~",
22
"ext" : "txt",
23
"foo" : "bar",
24
"id" : 123,
25
}
26
27
28
class TestPath(unittest.TestCase):
29
30
def _pfmt(self, data={}, kwdict=False, extr=extractor.find("noop")):
31
pathfmt = path.PathFormat(extr)
32
33
if kwdict:
34
pathfmt.set_directory({
35
**(kwdict if isinstance(kwdict, dict) else KWDICT),
36
**data,
37
})
38
39
return pathfmt
40
41
def setUp(self):
42
config.clear()
43
path.WINDOWS = False
44
45
46
class TestPathObject(TestPath):
47
48
def test_default(self):
49
pfmt = self._pfmt()
50
51
self.assertEqual(pfmt.kwdict, {})
52
self.assertEqual(pfmt.delete, False)
53
self.assertEqual(pfmt.filename, "")
54
self.assertEqual(pfmt.extension, "")
55
self.assertEqual(pfmt.directory, "")
56
self.assertEqual(pfmt.realdirectory, "")
57
self.assertEqual(pfmt.path, "")
58
self.assertEqual(pfmt.realpath, "")
59
self.assertEqual(pfmt.temppath, "")
60
self.assertEqual(pfmt.basedirectory, "./gallery-dl/")
61
self.assertEqual(pfmt.strip, "")
62
63
self.assertIs(pfmt.filename_conditions, None)
64
self.assertIs(pfmt.directory_conditions, None)
65
66
self.assertTrue(callable(pfmt.extension_map))
67
self.assertTrue(callable(pfmt.extension_map))
68
self.assertTrue(callable(pfmt.extension_map))
69
self.assertTrue(callable(pfmt.clean_segment))
70
self.assertTrue(callable(pfmt.clean_path))
71
72
self.assertTrue(callable(pfmt.filename_formatter))
73
for fmt in pfmt.directory_formatters:
74
self.assertTrue(callable(fmt))
75
76
def test_str(self):
77
pfmt = self._pfmt()
78
self.assertEqual(str(pfmt), pfmt.realdirectory)
79
self.assertEqual(str(pfmt), "")
80
81
pfmt = self._pfmt()
82
pfmt.set_directory(KWDICT)
83
pfmt.set_filename(KWDICT)
84
pfmt.build_path()
85
self.assertEqual(str(pfmt), pfmt.realpath)
86
self.assertEqual(str(pfmt), "./gallery-dl/test/file.ext")
87
88
89
class TestPathOptions(TestPath):
90
91
def test_option_filename(self):
92
fname = self._pfmt().build_filename(KWDICT)
93
self.assertEqual(fname , "file.ext")
94
95
config.set((), "filename", "foo.{foo}")
96
fname = self._pfmt().build_filename(KWDICT)
97
self.assertEqual(fname, "foo.bar")
98
99
config.set((), "filename", {
100
"foo == 'baz'": "foo",
101
"id % 2" : "bar",
102
"" : "baz",
103
})
104
fname = self._pfmt().build_filename(KWDICT)
105
self.assertEqual(fname, "bar")
106
107
def test_option_directory(self):
108
pfmt = self._pfmt(kwdict=True)
109
self.assertEqual(pfmt.directory , "./gallery-dl/test/")
110
self.assertEqual(pfmt.realdirectory, "./gallery-dl/test/")
111
112
config.set((), "directory", ["{foo}", "bar"])
113
pfmt = self._pfmt(kwdict=True)
114
self.assertEqual(pfmt.directory , "./gallery-dl/bar/bar/")
115
self.assertEqual(pfmt.realdirectory, "./gallery-dl/bar/bar/")
116
117
config.set((), "directory", {
118
"foo == 'baz'": ["a", "b", "c"],
119
"id % 2" : ["odd", "{id}"],
120
"" : ["{foo}", "bar"],
121
})
122
pfmt = self._pfmt(kwdict=True)
123
self.assertEqual(pfmt.directory , "./gallery-dl/odd/123/")
124
self.assertEqual(pfmt.realdirectory, "./gallery-dl/odd/123/")
125
126
def test_option_basedirectory(self):
127
config.set((), "base-directory", "{foo}")
128
pfmt = self._pfmt(kwdict=True)
129
self.assertEqual(pfmt.realdirectory, "{foo}/test/")
130
131
config.set((), "base-directory", {
132
"foo == 'baz'": "bar",
133
"id % 2" : "./odd",
134
"" : "./default",
135
})
136
pfmt = self._pfmt(kwdict=True)
137
self.assertEqual(pfmt.realdirectory, "./odd/test/")
138
139
def test_option_keywordsdefault(self):
140
config.set((), "directory", ["{baz}"])
141
config.set((), "base-directory", "")
142
143
pfmt = self._pfmt(kwdict=True)
144
self.assertEqual(pfmt.realdirectory, "None/")
145
146
config.set((), "keywords-default", "ND")
147
pfmt = self._pfmt(kwdict=True)
148
self.assertEqual(pfmt.realdirectory, "ND/")
149
150
config.set((), "keywords-default", "")
151
pfmt = self._pfmt(kwdict=True)
152
self.assertEqual(pfmt.realdirectory, "")
153
154
def test_option_extensionmap_default(self):
155
kwdict = KWDICT.copy()
156
pfmt = self._pfmt()
157
pfmt.set_filename(kwdict)
158
self.assertEqual(pfmt.extension, "ext")
159
160
pfmt.set_extension("jpg")
161
self.assertEqual(pfmt.extension, "jpg")
162
self.assertEqual(kwdict["extension"], "jpg")
163
164
pfmt.set_extension("png")
165
self.assertEqual(pfmt.extension, "png")
166
self.assertEqual(kwdict["extension"], "png")
167
168
pfmt.set_extension("jpeg")
169
self.assertEqual(pfmt.extension, "jpg")
170
self.assertEqual(kwdict["extension"], "jpg")
171
172
for ext, repl in path.EXTENSION_MAP.items():
173
pfmt.set_extension(ext)
174
self.assertEqual(pfmt.extension, repl)
175
self.assertEqual(kwdict["extension"], repl)
176
177
def test_option_extensionmap_custom(self):
178
extmap = {
179
"bitmap": "bmp",
180
"ping" : "png",
181
"jiff" : "gif",
182
}
183
config.set((), "extension-map", extmap)
184
185
kwdict = KWDICT.copy()
186
pfmt = self._pfmt()
187
pfmt.set_filename(kwdict)
188
189
pfmt.set_extension("jpg")
190
self.assertEqual(pfmt.extension, "jpg")
191
self.assertEqual(kwdict["extension"], "jpg")
192
193
pfmt.set_extension("ping")
194
self.assertEqual(pfmt.extension, "png")
195
self.assertEqual(kwdict["extension"], "png")
196
197
for ext, repl in extmap.items():
198
pfmt.set_extension(ext)
199
self.assertEqual(pfmt.extension, repl)
200
self.assertEqual(kwdict["extension"], repl)
201
202
for ext, repl in path.EXTENSION_MAP.items():
203
pfmt.set_extension(ext)
204
self.assertNotEqual(pfmt.extension, repl)
205
self.assertNotEqual(kwdict["extension"], repl)
206
207
def test_option_pathrestrict(self):
208
config.set((), "filename", "{name}.{ext}")
209
210
config.set((), "path-restrict", "unix")
211
fname = self._pfmt().build_filename(KWDICT)
212
self.assertEqual(fname, "test-テスト-'&>-_:~.txt", "unix")
213
214
config.set((), "path-restrict", "windows")
215
fname = self._pfmt().build_filename(KWDICT)
216
self.assertEqual(fname, "test-テスト-'&_-__~.txt", "windows")
217
218
config.set((), "path-restrict", "ascii")
219
fname = self._pfmt().build_filename(KWDICT)
220
self.assertEqual(fname, "test____________.txt", "ascii")
221
222
config.set((), "path-restrict", "ascii+")
223
fname = self._pfmt().build_filename(KWDICT)
224
self.assertEqual(fname, "test-___-'&_-__~.txt", "ascii+")
225
226
def test_option_pathrestrict_custom(self):
227
config.set((), "filename", "{name}.{ext}")
228
229
config.set((), "path-restrict", "ts-")
230
fname = self._pfmt().build_filename(KWDICT)
231
self.assertEqual(fname, "_e___テスト_'&>_/:~._x_", "custom str")
232
233
config.set((), "path-restrict", {
234
"t": "A",
235
"s": "B",
236
"-": "###",
237
"/": "|"
238
})
239
fname = self._pfmt().build_filename(KWDICT)
240
self.assertEqual(fname, "AeBA###テスト###'&>###|:~.AxA", "custom dict")
241
242
config.set((), "path-restrict", {
243
"a-z": "x",
244
"テ": "te",
245
"ス": "su",
246
"ト": "to",
247
})
248
fname = self._pfmt().build_filename(KWDICT)
249
self.assertEqual(fname, "xxxx-tesuto-'&>-/:~.xxx", "custom dict range")
250
251
def test_option_pathreplace(self):
252
config.set((), "filename", "{name}.{ext}")
253
254
config.set((), "path-restrict", "unix")
255
config.set((), "path-replace", "&")
256
fname = self._pfmt().build_filename(KWDICT)
257
self.assertEqual(fname, "test-テスト-'&>-&:~.txt", "&")
258
259
config.set((), "path-restrict", "windows")
260
config.set((), "path-replace", "***")
261
fname = self._pfmt().build_filename(KWDICT)
262
self.assertEqual(fname, "test-テスト-'&***-******~.txt", "***")
263
264
def test_option_pathremove(self):
265
config.set((), "filename", "{name}.{ext}")
266
267
config.set((), "path-remove", "-&/")
268
fname = self._pfmt().build_filename(KWDICT)
269
self.assertEqual(fname, "testテスト'>_:~.txt")
270
271
config.set((), "path-remove", "a-z0-9")
272
fname = self._pfmt().build_filename(KWDICT)
273
self.assertEqual(fname, "-テスト-'&>-_:~.")
274
275
def test_option_pathstrip(self):
276
config.set((), "directory", [" . {name}.{ext} . "])
277
config.set((), "base-directory", "")
278
config.set((), "path-restrict", "unix")
279
280
config.set((), "path-strip", "unix")
281
pfmt = self._pfmt(kwdict=True)
282
self.assertEqual(
283
pfmt.realdirectory, ". test-テスト-'&>-_:~.txt ./", "unix")
284
285
config.set((), "path-strip", "windows")
286
pfmt = self._pfmt(kwdict=True)
287
self.assertEqual(
288
pfmt.realdirectory, ". test-テスト-'&>-_:~.txt/", "windows")
289
290
config.set((), "path-strip", "txt")
291
pfmt = self._pfmt(kwdict=True)
292
self.assertEqual(
293
pfmt.realdirectory, ". test-テスト-'&>-_:~.txt ./", "custom")
294
295
296
if __name__ == "__main__":
297
unittest.main()
298
299