1
0
mirror of https://github.com/arsenetar/dupeguru.git synced 2026-01-28 17:31:38 +00:00

Compare commits

..

3 Commits

Author SHA1 Message Date
f26b515286 More testing with pyproject.toml 2025-12-31 21:22:46 -06:00
9f83018a1a feat: Moving to pyproject.toml for most project configuration
Still have some build migration to do and other cleanup.
2025-12-31 20:33:12 -06:00
Alexander Gee
8f197ea7e1 feat: Create longest and shortest path criteria (#1242)
* Create longest and shortest path criteria
2024-08-23 18:31:46 -05:00
10 changed files with 129 additions and 129 deletions

View File

@@ -96,6 +96,8 @@ class FilenameCategory(CriterionCategory):
DOESNT_END_WITH_NUMBER = 1
LONGEST = 2
SHORTEST = 3
LONGEST_PATH = 4
SHORTEST_PATH = 5
def format_criterion_value(self, value):
return {
@@ -103,6 +105,8 @@ class FilenameCategory(CriterionCategory):
self.DOESNT_END_WITH_NUMBER: tr("Doesn't end with number"),
self.LONGEST: tr("Longest"),
self.SHORTEST: tr("Shortest"),
self.LONGEST_PATH: tr("Longest Path"),
self.SHORTEST_PATH: tr("Shortest Path"),
}[value]
def extract_value(self, dupe):
@@ -116,6 +120,10 @@ class FilenameCategory(CriterionCategory):
return 0 if ends_with_digit else 1
else:
return 1 if ends_with_digit else 0
elif crit_value == self.LONGEST_PATH:
return len(str(dupe.folder_path)) * -1
elif crit_value == self.SHORTEST_PATH:
return len(str(dupe.folder_path))
else:
value = len(value)
if crit_value == self.LONGEST:
@@ -130,6 +138,8 @@ class FilenameCategory(CriterionCategory):
self.DOESNT_END_WITH_NUMBER,
self.LONGEST,
self.SHORTEST,
self.LONGEST_PATH,
self.SHORTEST_PATH,
]
]

View File

@@ -112,7 +112,7 @@ msgstr "Размеры"
#: core\pe\result_table.py:21 core\se\result_table.py:21
msgid "Size (KB)"
msgstr "Размер (кБ)"
msgstr "Размер (КБ)"
#: core\pe\result_table.py:24
msgid "EXIF Timestamp"

View File

@@ -100,15 +100,15 @@ msgstr ""
#: core\app.py:469
msgid "Select a directory to copy marked files to"
msgstr "Выберите каталог, в который Вы хотите скопировать отмеченные файлы"
msgstr "Выберите каталог, в который вы хотите скопировать отмеченные файлы"
#: core\app.py:471
msgid "Select a directory to move marked files to"
msgstr "Выберите каталог для перемещения отмеченных файлов"
msgstr "Выберите каталог, в который вы хотите переместить отмеченные файлы"
#: core\app.py:510
msgid "Select a destination for your exported CSV"
msgstr "Выберите назначение для Вашего экспортируемого CSV"
msgstr "Выберите назначение для экспортируемого "
#: core\app.py:516 core\app.py:777 core\app.py:787
msgid "Couldn't write to file: {}"
@@ -124,7 +124,7 @@ msgstr "Вы собираетесь удалить %d файлов из резу
#: core\app.py:749
msgid "{} duplicate groups were changed by the re-prioritization."
msgstr "{} групп дубликатов было изменено при обновлении приоритета."
msgstr "{} групп дубликатов было изменено при реприоритезации."
#: core\app.py:797
msgid "The selected directories contain no scannable file."
@@ -136,7 +136,7 @@ msgstr "Сбор файлов для сканирования"
#: core\app.py:863
msgid "%s (%d discarded)"
msgstr "%s (%d отменено)"
msgstr "%s. (%d отменено)"
#: core\directories.py:191
msgid "Collected {} files to scan"
@@ -148,7 +148,7 @@ msgstr "Собрано {} каталогов для сканирования"
#: core\engine.py:27
msgid "%d matches found from %d groups"
msgstr "%d совпадений найдено из %d групп"
msgstr "Найдено %d совпадений из %d групп"
#: core\gui\deletion_options.py:71
msgid "You are sending {} file(s) to the Trash."
@@ -249,7 +249,7 @@ msgstr "%d / %d (%s / %s) дубликатов отмечено."
#: core\results.py:142
msgid " filter: %s"
msgstr " фильтр: %s"
msgstr "фильтр: %s"
#: core\scanner.py:114
msgid "Read metadata of %d/%d files"
@@ -262,4 +262,3 @@ msgstr "Почти готово! Вожусь с результатами..."
#: core\se\scanner.py:18
msgid "Folders"
msgstr "Папки"

View File

@@ -93,8 +93,8 @@ msgid ""
"Instead of sending files to trash, delete them directly. This option is "
"usually used as a workaround when the normal deletion method doesn't work."
msgstr ""
"Удалить файлы с диска вместо отправки в Корзину. Используйте, если нормальный "
"метод удаления не работает."
"Удалить файлы с диска вместо отправки в Корзину. Используйте если нормальный"
" метод удаления не работает."
#: qt/deletion_options.py:59 cocoa/en.lproj/Localizable.strings:0
msgid "Proceed"
@@ -189,7 +189,7 @@ msgstr "Несохранённые результаты"
#: qt/directories_dialog.py:231 cocoa/en.lproj/Localizable.strings:0
msgid "You have unsaved results, do you really want to quit?"
msgstr "Имеются несохранённые результаты, Вы действительно хотите выйти?"
msgstr "Имеются несохранённые результаты, вы действительно хотите выйти?"
#: qt/directories_dialog.py:239 cocoa/en.lproj/Localizable.strings:0
msgid "Select a folder to add to the scanning list"
@@ -205,7 +205,7 @@ msgstr "Все файлы (*.*)"
#: qt/directories_dialog.py:267 qt/result_window.py:311
msgid "dupeGuru Results (*.dupeguru)"
msgstr "Результаты dupeGuru (*.dupeguru)"
msgstr "Результаты dupeGuru (*. dupeguru)"
#: qt/directories_dialog.py:278
msgid "Start a new scan"
@@ -213,7 +213,7 @@ msgstr "Начать новую проверку"
#: qt/directories_dialog.py:279 cocoa/en.lproj/Localizable.strings:0
msgid "You have unsaved results, do you really want to continue?"
msgstr "Имеются несохранённые результаты, Вы действительно хотите продолжить?"
msgstr "Имеются несохранённые результаты, вы действительно хотите продолжить?"
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
msgid "Name"
@@ -256,7 +256,7 @@ msgstr "Теги для проверки:"
#: qt/me/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
msgid "Track"
msgstr "Дорожка"
msgstr "Трек"
#: qt/me/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
msgid "Artist"
@@ -323,7 +323,7 @@ msgstr "Уровень фильтрации:"
#: qt/preferences_dialog.py:69
msgid "More Results"
msgstr "Больше результатов"
msgstr "Дополнительные результаты"
#: qt/preferences_dialog.py:74
msgid "Fewer Results"
@@ -379,7 +379,7 @@ msgstr ""
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
msgid "Problems!"
msgstr "Проблема!"
msgstr "Проблемка!"
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
msgid ""
@@ -409,15 +409,15 @@ msgstr "Показать значения разницы"
#: qt/result_window.py:60
msgid "Send Marked to Recycle Bin..."
msgstr "Переместить отмеченные в Корзину..."
msgstr "Переместить отмеченные в Корзину"
#: qt/result_window.py:61 cocoa/en.lproj/Localizable.strings:0
msgid "Move Marked to..."
msgstr "Переместить отмеченные в..."
msgstr "Переместить отмеченные в"
#: qt/result_window.py:62 cocoa/en.lproj/Localizable.strings:0
msgid "Copy Marked to..."
msgstr "Скопировать отмеченные в..."
msgstr "Скопировать отмеченные в"
#: qt/result_window.py:63 cocoa/en.lproj/Localizable.strings:0
msgid "Remove Marked from Results"
@@ -477,7 +477,7 @@ msgstr "Экспорт в CSV"
#: qt/result_window.py:89 cocoa/en.lproj/Localizable.strings:0
msgid "Save Results..."
msgstr "Сохранить результаты..."
msgstr "Сохранить результаты"
#: qt/result_window.py:90 cocoa/en.lproj/Localizable.strings:0
msgid "Invoke Custom Command"
@@ -509,15 +509,15 @@ msgstr "Значения разницы"
#: qt/result_window.py:310 cocoa/en.lproj/Localizable.strings:0
msgid "Select a file to save your results to"
msgstr "Выберите файл для сохранения Ваших результатов"
msgstr "Выберите файл, чтобы сохранить ваши результаты"
#: qt/se/preferences_dialog.py:41
msgid "Ignore files smaller than"
msgstr "Игнорировать файлы меньше, чем"
msgstr "Игнорировать файлы меньше чем"
#: qt/se/preferences_dialog.py:52 cocoa/en.lproj/Localizable.strings:0
msgid "KB"
msgstr "кБ"
msgstr "КБ"
#: cocoa/en.lproj/Localizable.strings:0
msgid "%@ Results"
@@ -549,7 +549,7 @@ msgstr "Все на передний план"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Check for update..."
msgstr "Проверка обновлений..."
msgstr "Проверка обновлений"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Close Window"
@@ -594,7 +594,7 @@ msgstr "Настройки dupeGuru"
#: cocoa/en.lproj/Localizable.strings:0
msgid "dupeGuru Results"
msgstr "Результаты dupeGuru"
msgstr "Результаты dupeGuru "
#: cocoa/en.lproj/Localizable.strings:0
msgid "dupeGuru Website"
@@ -626,7 +626,7 @@ msgstr "Уровень фильтрации:"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Filter Results..."
msgstr "Отфильтровать результаты..."
msgstr "Отфильтровать результаты"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Folder Selection Window"
@@ -646,11 +646,11 @@ msgstr "Скрыть остальные"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Ignore files smaller than:"
msgstr "Пропускать файлы меньше, чем:"
msgstr "Пропускать файлы меньше чем:"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Load from file..."
msgstr "Загрузить из файла..."
msgstr "Загрузить из файла"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Minimize"
@@ -674,7 +674,7 @@ msgstr "Вставить"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Preferences..."
msgstr "Настройки..."
msgstr "Настройки"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Quick Look"
@@ -686,7 +686,7 @@ msgstr "Выйти из dupeGuru"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Reset to Default"
msgstr "Восстановить значение по умолчанию"
msgstr "Восстановить значения по умолчанию"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Reset To Defaults"
@@ -706,7 +706,7 @@ msgstr "Выбрать все"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Send Marked to Trash..."
msgstr "Переместить отмеченные в Корзину..."
msgstr "Переместить отмеченные в Корзину"
#: cocoa/en.lproj/Localizable.strings:0
msgid "Services"
@@ -754,11 +754,11 @@ msgstr "Выберите файл каталогов для загрузки"
#: qt\directories_dialog.py:338
msgid "dupeGuru Results (*.dupegurudirs)"
msgstr "Результаты dupeGuru (*.dupegurudirs)"
msgstr "Каталоги dupeGuru (*.dupegurudirs)"
#: qt\directories_dialog.py:347
msgid "Select a file to save your directories to"
msgstr "Выберите файл для сохранения Ваших каталогов"
msgstr "Выберите файл для сохранения каталогов"
#: qt\directories_dialog.py:348
msgid "dupeGuru Directories (*.dupegurudirs)"
@@ -798,7 +798,7 @@ msgstr ""
#: qt\exclude_list_table.py:36
msgid "Compilation error: "
msgstr "Ошибка компиляции: "
msgstr "Ошибка компиляции:"
#: qt\pe\image_viewer.py:56
msgid "Increase zoom"
@@ -835,7 +835,7 @@ msgstr "Переопределить значки темы на панели и
#: qt\pe\preferences_dialog.py:58
msgid ""
"Use our own internal icons instead of those provided by the theme engine"
msgstr "Использовать наши внутренние значки вместо значков, встроенных в тему"
msgstr "Используйте внутренние значки вместо значков, встроенных в тему"
#: qt\pe\preferences_dialog.py:66
msgid "Show scrollbars in image viewers"
@@ -965,7 +965,7 @@ msgstr ""
#: qt\se\preferences_dialog.py:68
msgid "Ignore files larger than"
msgstr "Игнорировать файлы больше, чем"
msgstr "Игнорировать файлы больше чем"
#: qt\app.py:135 qt\app.py:293
msgid "Clear Cache"
@@ -981,7 +981,7 @@ msgstr ""
#: qt\app.py:299
msgid "Cache cleared."
msgstr "Кэш очищен."
msgstr "Кэш очищен "
#: qt\preferences_dialog.py:173
msgid "Use dark style"
@@ -994,7 +994,8 @@ msgstr "Сохранить профиль сканирования"
#: qt\preferences_dialog.py:242
msgid "Profile the scan operation and save logs for optimization."
msgstr ""
"Настройте операцию сканирования и сохраните журналы для оптимизации."
"В папке установленной или портативной программы, есть папка Data в которую "
"сохраняется логи и файл с раширением *.profile для оптимизации."
#: qt\preferences_dialog.py:246
msgid "Logs located in: <a href=\"{}\">{}</a>"
@@ -1022,11 +1023,11 @@ msgstr "Под лицензией GPLv3"
#: qt\about_box.py:68
msgid "No update available."
msgstr "Обновления недоступны."
msgstr "У вас самая свежая версия"
#: qt\about_box.py:71
msgid "New version {} available, download <a href=\"{}\">here</a>."
msgstr "Обнаружена новая {} версия, загрузить <a href=\"{}\">тут</a>."
msgstr "Обнаружена новая {} версия, загружать <a href=\"{}\">тут</a>."
#: qt\error_report_dialog.py:50
msgid "Error Report"

View File

@@ -1,9 +1,86 @@
[build-system]
requires = ["setuptools"]
requires = ["setuptools >= 75.3.1"]
build-backend = "setuptools.build_meta"
[project]
name = "dupeGuru"
description = "dupeGuru is a tool to find duplicate files on your computer."
authors = [
{name = "Andrew Senetar", email = "arsenetar@voltaicideas.net"}
]
readme = "README.md"
license = "GPL-3.0-or-later"
license-files = ["LICENSE"]
keywords = ["deduplication"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: End Users/Desktop",
"Operating System :: MacOS :: MacOS X",
"Operating System :: Microsoft :: Windows",
"Operating System :: POSIX",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Desktop Environment :: File Managers",
]
requires-python = ">=3.7, <3.13"
dynamic = ["version"]
dependencies = [
"distro>=1.8.0,<2.0.0",
"mutagen>=1.46.0,<2.0.0",
"polib>=1.1.0,<2.0.0",
"PyQt5 >=5.15.0,<6.0; sys_platform != 'linux'",
"pywin32>=304; sys_platform == 'win32'",
"semantic-version>=2.0.0,<3.0.0",
"Send2Trash>=1.8.2",
"xxhash>=3.0.0,<4.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7,<8",
"flake8",
"black",
]
build = [
"dupeGuru[dev]",
"sphinx>=5.3.0,<8.0.0",
"pyinstaller>=5.6,<6.0; sys_platform != 'linux'"
]
[project.urls]
Homepage = "https://dupeguru.voltaicideas.net/"
Documentation = "https://dupeguru.voltaicideas.net/help/en/"
Repository = "https://github.com/arsenetar/dupeguru.git"
Issues = "https://github.com/arsenetar/dupeguru/issues"
Releases = "https://github.com/arsenetar/dupeguru/releases"
[project.gui-scripts]
dupeguru = "dupeguru.__main__:main"
[tool.black]
line-length = 120
[tool.isort]
# make it compatible with black
profile = "black"
skip_gitignore = true
[tool.setuptools.packages.find]
include = ["core", "hscommon", "qt"]
[tool.setuptools.dynamic]
version = {attr = "core.__version__"}
[tool.setuptools]
ext-modules = [
{name = "core.pe._block", sources = ["core/pe/modules/block.c", "core/pe/modules/common.c"], include-dirs = ["core/pe/modules"]},
{name = "core.pe._cache", sources = ["core/pe/modules/cache.c", "core/pe/modules/common.c"], include-dirs = ["core/pe/modules"]},
{name = "qt.pe._block_qt", sources = ["qt/pe/modules/block.c"]},
]

View File

@@ -1,4 +0,0 @@
pytest>=7,<8
flake8
black
pyinstaller>=5.6,<6.0; sys_platform != 'linux'

View File

@@ -1,9 +0,0 @@
distro>=1.8.0,<2.0.0
mutagen>=1.46.0,<2.0.0
polib>=1.1.0,<2.0.0
PyQt5 >=5.15.0,<6.0; sys_platform != 'linux'
pywin32>=304; sys_platform == 'win32'
semantic-version>=2.0.0,<3.0.0
Send2Trash>=1.8.2,<2.0.0
sphinx>=5.3.0,<8.0.0
xxhash>=3.0.0,<4.0.0

View File

@@ -1,48 +0,0 @@
[metadata]
name = dupeGuru
version = attr: core.__version__
url = https://github.com/arsenetar/dupeguru
project_urls =
Bug Reports = https://github.com/arsenetar/dupeguru/issues
author = Andrew Senetar
author_email = arsenetar@voltaicideas.net
license = GPLv3
license_files = license
description = dupeGuru is a tool to find duplicate files on your computer.
long_description = file:README.md
long_description_content_type = text/markdown
classifiers =
Development Status :: 5 - Production/Stable
Intended Audience :: End Users/Desktop
License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Operating System :: MacOS :: MacOS X
Operating System :: Microsoft :: Windows
Operating System :: POSIX
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3 :: Only
Topic :: Desktop Environment :: File Managers
[options]
packages = find:
python_requires = >=3.7
install_requires =
Send2Trash>=1.8.2,<2.0.0
mutagen>=1.46.0,<2.0.0
distro>=1.8.0,<2.0.0
PyQt5 >=5.15.0,<6.0; sys_platform != 'linux'
pywin32>=228; sys_platform == 'win32'
semantic-version>=2.0.0,<3.0.0
xxhash>=3.0.0,<4.0.0
setup_requires =
sphinx>=3.0.0
polib>=1.1.0
tests_require =
pytest >=6,<7
include_package_data = true
[options.entry_points]
console_scripts =
dupeguru = run.py

View File

@@ -1,26 +0,0 @@
from setuptools import setup, Extension
from pathlib import Path
exts = [
Extension(
"core.pe._block",
[
str(Path("core", "pe", "modules", "block.c")),
str(Path("core", "pe", "modules", "common.c")),
],
include_dirs=[str(Path("core", "pe", "modules"))],
),
Extension(
"core.pe._cache",
[
str(Path("core", "pe", "modules", "cache.c")),
str(Path("core", "pe", "modules", "common.c")),
],
include_dirs=[str(Path("core", "pe", "modules"))],
),
Extension("qt.pe._block_qt", [str(Path("qt", "pe", "modules", "block.c"))]),
]
headers = [str(Path("core", "pe", "modules", "common.h"))]
setup(ext_modules=exts, headers=headers)