forked from pool/python-eradicate
Accepting request 999222 from home:bnavigator:branches:devel:languages:python
- Update to 2.1.0 * New class-based API. - No further release notes OBS-URL: https://build.opensuse.org/request/show/999222 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-eradicate?expand=0&rev=7
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4ffda82aae6fd49dfffa777a857cb758d77502a1f2e0f54c9ac5155a39d2d01a
|
||||
size 4644
|
||||
3
eradicate-2.1.0.tar.gz
Normal file
3
eradicate-2.1.0.tar.gz
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aac7384ab25b1bf21c4c012de9b4bf8398945a14c98c911545b2ea50ab558014
|
||||
size 6007
|
||||
@@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Aug 25 09:45:28 UTC 2022 - Ben Greiner <code@bnavigator.de>
|
||||
|
||||
- Update to 2.1.0
|
||||
* New class-based API.
|
||||
- No further release notes
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Feb 14 01:29:57 UTC 2019 - Jan Engelhardt <jengelh@inai.de>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package python-eradicate
|
||||
#
|
||||
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
|
||||
# Copyright (c) 2022 SUSE LLC
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
|
||||
Name: python-eradicate
|
||||
Version: 1.0
|
||||
Version: 2.1.0
|
||||
Release: 0
|
||||
Summary: Python utility for removing commented-out code
|
||||
License: MIT
|
||||
@@ -30,7 +30,7 @@ BuildRequires: %{python_module setuptools}
|
||||
BuildRequires: fdupes
|
||||
BuildRequires: python-rpm-macros
|
||||
Requires(post): update-alternatives
|
||||
Requires(postun): update-alternatives
|
||||
Requires(postun):update-alternatives
|
||||
BuildArch: noarch
|
||||
%python_subpackages
|
||||
|
||||
@@ -62,12 +62,13 @@ cp %{SOURCE1} .
|
||||
%python_uninstall_alternative eradicate
|
||||
|
||||
%check
|
||||
export PYTHONPATH=.
|
||||
%python_exec %{SOURCE1}
|
||||
%pyunittest -v
|
||||
|
||||
%files %{python_files}
|
||||
%doc README.rst
|
||||
%python_alternative %{_bindir}/eradicate
|
||||
%{python_sitelib}/*
|
||||
%{python_sitelib}/eradicate.py*
|
||||
%pycache_only %{python_sitelib}/__pycache__/eradicate*.pyc
|
||||
%{python_sitelib}/eradicate-%{version}*-info
|
||||
|
||||
%changelog
|
||||
|
||||
@@ -10,6 +10,11 @@ import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
try: # pragma: no cover
|
||||
import mock
|
||||
except ModuleNotFoundError: # pragma: no cover
|
||||
import unittest.mock as mock
|
||||
import re
|
||||
|
||||
import eradicate
|
||||
|
||||
@@ -17,141 +22,254 @@ import eradicate
|
||||
class UnitTests(unittest.TestCase):
|
||||
|
||||
def test_comment_contains_code(self):
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# This is a (real) comment.'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# 123'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# 123.1'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# 1, 2, 3'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'x = 1 # x = 1'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# pylint: disable=redefined-outer-name'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# Issue #999: This is not code'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'# x = 1'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#from foo import eradicate'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#import eradicate'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#"key": value,'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#"key": "value",'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#"key": 1 + 1,'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
"#'key': 1 + 1,"))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#"key": {'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#}'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#} )]'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#},'))
|
||||
|
||||
def test_comment_contains_code_with_print(self):
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#print'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#print(1)'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#print 1'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#to print'))
|
||||
|
||||
def test_comment_contains_code_with_return(self):
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#return x'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#to return'))
|
||||
|
||||
def test_comment_contains_code_with_multi_line(self):
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#def foo():'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#else:'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'# else : '))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'# "foo %d" % \\'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#elif True:'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#x = foo('))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'#except Exception:'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# this is = to that :('))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#else'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#or else:'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#else True:'))
|
||||
|
||||
def test_comment_contains_code_with_sentences(self):
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#code is good'))
|
||||
|
||||
def test_comment_contains_code_with_encoding(self):
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# coding=utf-8'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'#coding= utf-8'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# coding: utf-8'))
|
||||
|
||||
self.assertFalse(eradicate.comment_contains_code(
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# encoding: utf8'))
|
||||
|
||||
self.assertTrue(eradicate.comment_contains_code(
|
||||
self.assertTrue(eradicate.Eradicator().comment_contains_code(
|
||||
'# codings=utf-8'))
|
||||
|
||||
def test_comment_contains_code_with_default_whitelist(self):
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# pylint: disable=A0123'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# pylint:disable=A0123'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# pylint: disable = A0123'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# pylint:disable = A0123'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# pyright: reportErrorName=true'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# noqa'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# NOQA'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# noqa: A123'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# noqa:A123'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# nosec'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# fmt: on'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# fmt: off'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# fmt:on'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# fmt:off'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: on'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:on'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: off'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:off'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: skip'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:skip'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: skip_file'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:skip_file'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: split'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:split'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: dont-add-imports'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:dont-add-imports'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: dont-add-imports: ["import os"]'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:dont-add-imports: ["import os"]'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort: dont-add-imports:["import os"]'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# isort:dont-add-imports:["import os"]'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# type: ignore'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# type:ignore'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# type: ignore[import]'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# type:ignore[import]'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# TODO: Do that'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# FIXME: Fix that'))
|
||||
|
||||
self.assertFalse(eradicate.Eradicator().comment_contains_code(
|
||||
'# XXX: What ever'))
|
||||
|
||||
|
||||
def test_commented_out_code_line_numbers(self):
|
||||
self.assertEqual(
|
||||
[1, 3],
|
||||
list(eradicate.commented_out_code_line_numbers(
|
||||
list(eradicate.Eradicator().commented_out_code_line_numbers(
|
||||
"""\
|
||||
# print(5)
|
||||
# This is a comment.
|
||||
@@ -166,7 +284,7 @@ y = 1 # x = 3
|
||||
def test_commented_out_code_line_numbers_with_errors(self):
|
||||
self.assertEqual(
|
||||
[1, 3],
|
||||
list(eradicate.commented_out_code_line_numbers(
|
||||
list(eradicate.Eradicator().commented_out_code_line_numbers(
|
||||
"""\
|
||||
# print(5)
|
||||
# This is a comment.
|
||||
@@ -184,7 +302,7 @@ def foo():
|
||||
def test_commented_out_code_line_numbers_with_with_statement(self):
|
||||
self.assertEqual(
|
||||
[1, 2],
|
||||
list(eradicate.commented_out_code_line_numbers("""\
|
||||
list(eradicate.Eradicator().commented_out_code_line_numbers("""\
|
||||
# with open('filename', 'w') as out_file:
|
||||
# json.dump(objects, out_file)
|
||||
#
|
||||
@@ -193,7 +311,7 @@ def foo():
|
||||
def test_commented_out_code_line_numbers_with_for_statement(self):
|
||||
self.assertEqual(
|
||||
[1, 2],
|
||||
list(eradicate.commented_out_code_line_numbers("""\
|
||||
list(eradicate.Eradicator().commented_out_code_line_numbers("""\
|
||||
# for x in y:
|
||||
# oops = x.ham
|
||||
""")))
|
||||
@@ -208,7 +326,7 @@ y = 1 # x = 3
|
||||
# The below is another comment.
|
||||
# 3 / 2 + 21
|
||||
""",
|
||||
''.join(eradicate.filter_commented_out_code(
|
||||
''.join(eradicate.Eradicator().filter_commented_out_code(
|
||||
"""\
|
||||
# print(5)
|
||||
# This is a comment.
|
||||
@@ -233,7 +351,7 @@ if False: \\
|
||||
"""
|
||||
self.assertEqual(
|
||||
line,
|
||||
''.join(eradicate.filter_commented_out_code(line)))
|
||||
''.join(eradicate.Eradicator().filter_commented_out_code(line)))
|
||||
|
||||
def test_filter_commented_out_code_with_larger_example(self):
|
||||
self.assertEqual(
|
||||
@@ -245,7 +363,7 @@ y = 1 # x = 3
|
||||
# The below is another comment.
|
||||
# 3 / 2 + 21
|
||||
""",
|
||||
''.join(eradicate.filter_commented_out_code(
|
||||
''.join(eradicate.Eradicator().filter_commented_out_code(
|
||||
"""\
|
||||
# print(5)
|
||||
# This is a comment.
|
||||
@@ -266,13 +384,13 @@ y = 1 # x = 3
|
||||
"""
|
||||
self.assertEqual(
|
||||
code,
|
||||
''.join(eradicate.filter_commented_out_code(code,
|
||||
''.join(eradicate.Eradicator().filter_commented_out_code(code,
|
||||
aggressive=False)))
|
||||
|
||||
def test_filter_commented_out_code_with_annotation(self):
|
||||
self.assertEqual(
|
||||
'\n\n\n',
|
||||
''.join(eradicate.filter_commented_out_code("""\
|
||||
''.join(eradicate.Eradicator().filter_commented_out_code("""\
|
||||
# class CommentedClass(object):
|
||||
# def __init__(self, prop: int) -> None:
|
||||
# self.property = prop
|
||||
@@ -290,7 +408,21 @@ y = 1 # x = 3
|
||||
def test_detect_encoding_with_bad_encoding(self):
|
||||
with temporary_file('# -*- coding: blah -*-\n') as filename:
|
||||
self.assertEqual('latin-1',
|
||||
eradicate.detect_encoding(filename))
|
||||
eradicate.Eradicator().detect_encoding(filename))
|
||||
|
||||
def test_extend_whitelist(self):
|
||||
eradicator = eradicate.Eradicator()
|
||||
eradicator.update_whitelist(["foo"], True)
|
||||
self.assertTrue(
|
||||
eradicator.WHITELIST_REGEX == re.compile(
|
||||
r'|'.join(list(eradicator.DEFAULT_WHITELIST) + ["foo"]), flags=re.IGNORECASE
|
||||
)
|
||||
)
|
||||
|
||||
def test_update_whitelist(self):
|
||||
eradicator = eradicate.Eradicator()
|
||||
eradicator.update_whitelist(["foo"], False)
|
||||
self.assertTrue(eradicator.WHITELIST_REGEX == re.compile("foo", flags=re.IGNORECASE))
|
||||
|
||||
|
||||
class SystemTests(unittest.TestCase):
|
||||
@@ -372,6 +504,28 @@ class SystemTests(unittest.TestCase):
|
||||
standard_error=ignore)
|
||||
self.assertFalse(output_file.getvalue())
|
||||
|
||||
def test_returns_error_code_if_requested(self):
|
||||
with temporary_file("""\
|
||||
# x * 3 == False
|
||||
# x is a variable
|
||||
""") as filename:
|
||||
output_file = io.StringIO()
|
||||
result = eradicate.main(argv=['my_fake_program', filename, "-e"],
|
||||
standard_out=output_file,
|
||||
standard_error=None)
|
||||
self.assertTrue(result)
|
||||
|
||||
def test_returns_None_if_no_error_request(self):
|
||||
with temporary_file("""\
|
||||
# x * 3 == False
|
||||
# x is a variable
|
||||
""") as filename:
|
||||
output_file = io.StringIO()
|
||||
result = eradicate.main(argv=['my_fake_program', filename],
|
||||
standard_out=output_file,
|
||||
standard_error=None)
|
||||
self.assertTrue(result is None)
|
||||
|
||||
def test_end_to_end(self):
|
||||
with temporary_file("""\
|
||||
# x * 3 == False
|
||||
@@ -386,6 +540,26 @@ class SystemTests(unittest.TestCase):
|
||||
# x is a variable
|
||||
""", '\n'.join(process.communicate()[0].decode().split('\n')[2:]))
|
||||
|
||||
def test_whitelist(self):
|
||||
mock_update = mock.Mock()
|
||||
with mock.patch.object(eradicate.Eradicator, 'update_whitelist', mock_update):
|
||||
with temporary_file("# empty") as filename:
|
||||
result = eradicate.main(argv=['my_fake_program', '--whitelist', 'foo# bar', filename],
|
||||
standard_out=None,
|
||||
standard_error=None)
|
||||
self.assertTrue(result is None)
|
||||
mock_update.assert_called_once_with(["foo", " bar"], False)
|
||||
|
||||
def test_whitelist_extend(self):
|
||||
mock_update = mock.Mock()
|
||||
with mock.patch.object(eradicate.Eradicator, 'update_whitelist', mock_update):
|
||||
with temporary_file("# empty") as filename:
|
||||
result = eradicate.main(argv=['my_fake_program', '--whitelist-extend', 'foo #bar', filename],
|
||||
standard_out=None,
|
||||
standard_error=None)
|
||||
self.assertTrue(result is None)
|
||||
mock_update.assert_called_once_with(["foo ", "bar"], True)
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def temporary_file(contents, directory='.', prefix=''):
|
||||
|
||||
Reference in New Issue
Block a user