content: # SPDX-FileCopyrightText: mpvQC developers
  #
  # SPDX-License-Identifier: MIT
  
  [project]
  name = "mpvQC"
  version = "0.9.0-beta"
  description = "libmpv based application for quality control of videos"
  requires-python = ">=3.13"
  readme = "README.MD"
  dependencies = [
      "inject>=5.3.0",
      "Jinja2>=3.1.6",
      "loguru~=0.7.3",
      "mpv>=1.0.8",
      "PySide6-Essentials==6.10.0",
      "pywin32>=311; sys_platform == 'win32'",
  ]
  classifiers = [
      "Development Status :: 4 - Beta",                           # 4 - Beta, 5 - Production/Stable
      "License :: OSI Approved :: GNU General Public License v3",
      "Programming Language :: Python :: 3.13",
      "Private :: Do Not Upload",
  ]
  
  [dependency-groups]
  dev = [
      "pytest>=8.4.2",
      "materialyoucolor>=2.0.10",
  ]
  
  [project.urls]
  Homepage = "https://mpvqc.github.io"
  Repository = "https://github.com/mpvqc/mpvQC"
  Issues = "https://github.com/mpvqc/mpvQC/issues"
  
  [tool.ruff]
  line-length = 120
  target-version = "py313"
  
  [tool.ruff.lint]
  preview = true
  extend-select = [
      "F",    # Pyflakes – basic errors like unused imports, undefined names
      "FLY",  # Flynt – suggests f-string conversion
      "I",    # Isort – enforces import sorting
      "PERF", # Performance – flags suboptimal code patterns
      "PGH",  # Pygrep-hooks – enforces commit hook conventions (if any)
      "FURB", # Refurb – style suggestions from the `refurb` tool
      "PL",   # Pylint – a broad range of static analysis rules
      "S",    # Bandit – security issues (e.g. eval, subprocess, etc.)
      "UP",   # Upgrade – flags code that could use newer Python features
  
      # flake8
      "EM",   # Error Messages – ensures proper string formatting in exception messages
      "C",    # Cyclomatic complexity (mccabe) – flags overly complex code
      "CPY",  # Copyright – checks for required copyright notices
      "DTZ",  # datetime-timezone – flags naive datetime usage
      "EXE",  # Executable – checks for shebangs and file permissions
      "FA",   # Future Annotations – flags issues with postponed evaluation of annotations
      "FIX",  # Fixme – flags TODO, FIXME, and similar comments
      "G",    # Logging – ensures proper usage of logging practices
      "ICN",  # Import Conventions – checks for naming and import rules
      "ISC",  # Implicit String Concatenation – disallows adjacent string literals without +
      "LOG",  # Logging Format – flags improper logging string formatting
      "PIE",  # Pie – miscellaneous Python code style improvements
      "PYI",  # Pyi – rules for stub (`.pyi`) files
      "PT",   # Pytest – checks for pytest best practices
      "Q",    # Quotes – enforces consistent quote style
      "RSE",  # Raise – flags incorrect `raise` statements
      "RET",  # Return – flags redundant or inconsistent return statements
      "SLF",  # Self – restricts access to private members
      "SIM",  # Simplify – flags code that can be simplified
      "SLOT", # Slots – enforces use of `__slots__` where appropriate
      "TID",  # Tidiness – general code tidiness rules
      "TD",   # TODO – flags TODO comments with optional enforcement
      "TC",   # Type-checking – ensures proper usage of `TYPE_CHECKING` blocks
      "ARG",  # Unused Arguments – flags unused function arguments
      "PTH",  # Pathlib – encourages use of `pathlib` over `os.path`
  ]
  
  ignore = [
      "PLC0415", # `import` should be at top of file
      "PLC1901", # Simplifiable string comparisons
      "PLR0904", # Too many public methods
      "PLR0911", # Too many return statements
      "PLR0913", # Too many arguments
      "PLR0914", # Too many local variables
      "PLR0917", # Too many positional arguments
      "PLR6301", # Method could be a function
      "PLW0108", # Statement has no effect
  ]
  
  [tool.ruff.lint.extend-per-file-ignores]
  "test/**" = [ # Adjust rules for test files
      "S101", # Allow `assert` in tests
      "ARG",  # Ignore unused arguments (common in fixtures)
      "FBT",  # Ignore boolean positional argument check (e.g. in parametrize)
      "SLF",  # Ignore access to private members
      "PLR",  # Ignore complexity/readability issues
  ]
  
  "**/test_*.py" = [
      # Adjust rules for test files
      "S101", # Allow `assert` in tests
  ]
  
  [tool.ruff.lint.isort]
  known-first-party = ["mpvqc", "rc_project"]
  
  [tool.ruff.lint.flake8-copyright]
  notice-rgx = "SPDX-FileCopyrightText: mpvQC developers"
  
  [tool.pyside6-project]
  files = [
      # WARNING! This list is auto updated by the just build helper
      "data/config/backup-template.jinja",
      "data/config/export-template.jinja",
      "data/config/input.conf",
      "data/config/mpv-linux.conf",
      "data/config/mpv-windows.conf",
      "data/fonts/NotoSans-Bold.ttf",
      "data/fonts/NotoSans-Italic.ttf",
      "data/fonts/NotoSans-Regular.ttf",
      "data/fonts/NotoSans-SemiBold.ttf",
      "data/fonts/NotoSansHebrew-Bold.ttf",
      "data/fonts/NotoSansHebrew-Regular.ttf",
      "data/fonts/NotoSansHebrew-SemiBold.ttf",
      "data/fonts/NotoSansMono-Regular.ttf",
      "data/icon.svg",
      "data/icons/arrow_drop_down_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/aspect_ratio_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/check_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/close_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/close_fullscreen_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/comment_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/content_copy_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/delete_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/download_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/edit_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/exit_to_app_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/export_notes_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/file_open_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/folder_open_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/info_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/inventory_2_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_arrow_down_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_arrow_left_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_arrow_right_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_arrow_up_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_backspace_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_double_arrow_right_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/keyboard_return_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/language_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/minimize_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/movie_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/movie_edit_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/notes_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/open_in_full_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/palette_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/play_arrow_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/save_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/save_as_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/search_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/settings_backup_restore_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/space_bar_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/subtitles_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/title_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/update_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/upload_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/icons/vertical_split_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg",
      "data/themes.json",
      "i18n/de-DE.ts",
      "i18n/en-US.ts",
      "i18n/es-MX-qt-overrides.ts",
      "i18n/es-MX.ts",
      "i18n/he-IL.ts",
      "i18n/it-IT.ts",
      "i18n/pt-PT.ts",
      "main.py",
      "mpvqc/__init__.py",
      "mpvqc/application.py",
      "mpvqc/datamodels.py",
      "mpvqc/decorators.py",
      "mpvqc/helpers/__init__.py",
      "mpvqc/helpers/close.py",
      "mpvqc/helpers/label_width_calculator.py",
      "mpvqc/helpers/player.py",
      "mpvqc/helpers/player_properties.py",
      "mpvqc/helpers/settings.py",
      "mpvqc/helpers/utility.py",
      "mpvqc/helpers/window_buttons.py",
      "mpvqc/helpers/window_properties.py",
      "mpvqc/injections.py",
      "mpvqc/logging.py",
      "mpvqc/models/__init__.py",
      "mpvqc/models/comments/__init__.py",
      "mpvqc/models/comments/item.py",
      "mpvqc/models/comments/model.py",
      "mpvqc/models/comments/roles.py",
      "mpvqc/models/comments/searcher.py",
      "mpvqc/models/comments/undo.py",
      "mpvqc/models/comments/utils.py",
      "mpvqc/models/export_templates.py",
      "mpvqc/models/import_options.py",
      "mpvqc/models/languages.py",
      "mpvqc/models/theme_palette.py",
      "mpvqc/models/theme_preview.py",
      "mpvqc/services/__init__.py",
      "mpvqc/services/application_environment.py",
      "mpvqc/services/application_paths.py",
      "mpvqc/services/comment_type_validator.py",
      "mpvqc/services/document_exporter.py",
      "mpvqc/services/document_importer.py",
      "mpvqc/services/exporter.py",
      "mpvqc/services/file_startup.py",
      "mpvqc/services/font_loader.py",
      "mpvqc/services/formatter_time.py",
      "mpvqc/services/frameless/__init__.py",
      "mpvqc/services/frameless/linux/__init__.py",
      "mpvqc/services/frameless/linux/event.py",
      "mpvqc/services/frameless/service.py",
      "mpvqc/services/frameless/win/__init__.py",
      "mpvqc/services/frameless/win/c_structures.py",
      "mpvqc/services/frameless/win/event.py",
      "mpvqc/services/frameless/win/utils.py",
      "mpvqc/services/i18n.py",
      "mpvqc/services/importer.py",
      "mpvqc/services/key_command.py",
      "mpvqc/services/label_width_calculator.py",
      "mpvqc/services/mimetype_provider.py",
      "mpvqc/services/operating_system_zoom_detector.py",
      "mpvqc/services/player.py",
      "mpvqc/services/quit.py",
      "mpvqc/services/resetter.py",
      "mpvqc/services/resource.py",
      "mpvqc/services/resource_reader.py",
      "mpvqc/services/reverse_translator.py",
      "mpvqc/services/settings.py",
      "mpvqc/services/state.py",
      "mpvqc/services/subtitle_importer.py",
      "mpvqc/services/theme.py",
      "mpvqc/services/type_mapper.py",
      "mpvqc/services/version_checker.py",
      "mpvqc/services/window_buttons.py",
      "mpvqc/startup.py",
      "mpvqc/viewmodels/__init__.py",
      "mpvqc/viewmodels/backup_timer.py",
      "mpvqc/viewmodels/content.py",
      "mpvqc/viewmodels/dialogs/__init__.py",
      "mpvqc/viewmodels/dialogs/about.py",
      "mpvqc/viewmodels/dialogs/appearance.py",
      "mpvqc/viewmodels/dialogs/backup.py",
      "mpvqc/viewmodels/dialogs/comment_types.py",
      "mpvqc/viewmodels/dialogs/edit_input.py",
      "mpvqc/viewmodels/dialogs/edit_mpv.py",
      "mpvqc/viewmodels/dialogs/export_settings.py",
      "mpvqc/viewmodels/dialogs/import_settings.py",
      "mpvqc/viewmodels/drop_area.py",
      "mpvqc/viewmodels/file_dialogs/__init__.py",
      "mpvqc/viewmodels/file_dialogs/export_file_dialog.py",
      "mpvqc/viewmodels/file_dialogs/import_file_dialogs.py",
      "mpvqc/viewmodels/footer.py",
      "mpvqc/viewmodels/header.py",
      "mpvqc/viewmodels/message_box_loader.py",
      "mpvqc/viewmodels/message_boxes/__init__.py",
      "mpvqc/viewmodels/message_boxes/quit.py",
      "mpvqc/viewmodels/message_boxes/reset.py",
      "mpvqc/viewmodels/message_boxes/version_check.py",
      "mpvqc/viewmodels/new_comment_menu.py",
      "mpvqc/viewmodels/player.py",
      "mpvqc/viewmodels/search_box.py",
      "mpvqc/viewmodels/theme.py",
      "mpvqc/views/__init__.py",
      "mpvqc/views/player_framebuffer_object.py",
      "mpvqc/views/player_win_id.py",
      "project.qrc",
      "qt/qml/MpvqcApplication.qml",
      "qt/qml/components/MpvqcDebugRectangle.qml",
      "qt/qml/components/MpvqcDialog.qml",
      "qt/qml/components/MpvqcHeader.qml",
      "qt/qml/components/MpvqcKeyboardFocusableButtonBox.qml",
      "qt/qml/components/MpvqcMenu.qml",
      "qt/qml/components/MpvqcMenuBarMenu.qml",
      "qt/qml/components/MpvqcMessageBox.qml",
      "qt/qml/components/MpvqcSpinBoxRow.qml",
      "qt/qml/components/MpvqcSwitchRow.qml",
      "qt/qml/components/MpvqcTextFieldRow.qml",
      "qt/qml/components/MpvqcTooltip.qml",
      "qt/qml/components/qmldir",
      "qt/qml/components/tst_MpvqcMenu.qml",
      "qt/qml/components/tst_MpvqcSpinBoxRow.qml",
      "qt/qml/components/tst_MpvqcSwitchRow.qml",
      "qt/qml/components/tst_MpvqcTextFieldRow.qml",
      "qt/qml/dialogs/MpvqcAboutDialog.qml",
      "qt/qml/dialogs/MpvqcAppearanceDialog.qml",
      "qt/qml/dialogs/MpvqcBackupDialog.qml",
      "qt/qml/dialogs/MpvqcCommentTypesDialog.qml",
      "qt/qml/dialogs/MpvqcEditInputDialog.qml",
      "qt/qml/dialogs/MpvqcEditMpvDialog.qml",
      "qt/qml/dialogs/MpvqcExportSettingsDialog.qml",
      "qt/qml/dialogs/MpvqcImportSettingsDialog.qml",
      "qt/qml/dialogs/MpvqcShortcutDialog.qml",
      "qt/qml/filedialogs/MpvqcExportDocumentFileDialog.qml",
      "qt/qml/filedialogs/MpvqcImportDocumentsFileDialog.qml",
      "qt/qml/filedialogs/MpvqcImportSubtitlesFileDialog.qml",
      "qt/qml/filedialogs/MpvqcImportVideoFileDialog.qml",
      "qt/qml/messageboxes/MpvqcDeleteCommentMessageBox.qml",
      "qt/qml/messageboxes/MpvqcDocumentNotCompatibleMessageBox.qml",
      "qt/qml/messageboxes/MpvqcExtendedExportErrorMessageBox.qml",
      "qt/qml/messageboxes/MpvqcExtendedExportMessageBox.qml",
      "qt/qml/messageboxes/MpvqcQuitMessageBox.qml",
      "qt/qml/messageboxes/MpvqcResetMessageBox.qml",
      "qt/qml/messageboxes/MpvqcVersionCheckMessageBox.qml",
      "qt/qml/messageboxes/MpvqcVideoFoundMessageBox.qml",
      "qt/qml/messageboxes/qmldir",
      "qt/qml/models/MpvqcCreditsModel.qml",
      "qt/qml/models/MpvqcLibraryModel.qml",
      "qt/qml/models/MpvqcShortcutsModel.qml",
      "qt/qml/models/qmldir",
      "qt/qml/utility/MpvqcResizeHandler.qml",
      "qt/qml/utility/MpvqcTheme.qml",
      "qt/qml/utility/MpvqcWindowProperties.qml",
      "qt/qml/utility/MpvqcWindowVisibilityHandler.qml",
      "qt/qml/utility/qmldir",
      "qt/qml/utility/tst_MpvqcResizeHandler.qml",
      "qt/qml/utility/tst_MpvqcWindowVisibilityHandler.qml",
      "qt/qml/views/main/MpvqcContentView.qml",
      "qt/qml/views/main/MpvqcDialogLoaderView.qml",
      "qt/qml/views/main/MpvqcFileDialogLoaderView.qml",
      "qt/qml/views/main/MpvqcFileDropAreaView.qml",
      "qt/qml/views/main/MpvqcFooterView.qml",
      "qt/qml/views/main/MpvqcHeaderView.qml",
      "qt/qml/views/main/MpvqcMessageBoxLoaderView.qml",
      "qt/qml/views/main/MpvqcNewCommentMenuView.qml",
      "qt/qml/views/main/MpvqcPlayerView.qml",
      "qt/qml/views/main/qmldir",
      "qt/qml/views/main/tst_MpvqcDialogLoaderView.qml",
      "qt/qml/views/main/tst_MpvqcFileDialogLoaderView.qml",
      "qt/qml/views/main/tst_MpvqcMessageBoxLoaderView.qml",
      "qt/qml/views/main/tst_MpvqcNewCommentMenuView.qml",
      "qt/qml/views/qmldir",
      "qt/qml/views/table/MpvqcCommentHighlighter.js",
      "qt/qml/views/table/MpvqcCommentList.qml",
      "qt/qml/views/table/MpvqcCommentListDelegate.qml",
      "qt/qml/views/table/MpvqcContextMenu.qml",
      "qt/qml/views/table/MpvqcEditCommentPopup.qml",
      "qt/qml/views/table/MpvqcEditCommentTypeMenu.qml",
      "qt/qml/views/table/MpvqcEditTimePopup.qml",
      "qt/qml/views/table/MpvqcPlaceholder.qml",
      "qt/qml/views/table/MpvqcSearchBoxView.qml",
      "qt/qml/views/table/MpvqcTable.qml",
      "qt/qml/views/table/qmldir",
      "qt/qml/views/table/tst_MpvqcCommentList.qml",
  ]
  