rummage 4.21.2__tar.gz → 4.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rummage-4.21.2 → rummage-4.22}/LICENSE.md +1 -1
- {rummage-4.21.2 → rummage-4.22}/PKG-INFO +9 -13
- {rummage-4.21.2 → rummage-4.22}/README.md +0 -3
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/about/changelog.md +11 -3
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/preferences.md +2 -0
- {rummage-4.21.2 → rummage-4.22}/gui.fbp +19 -1
- {rummage-4.21.2 → rummage-4.22}/hatch_build.py +0 -1
- {rummage-4.21.2 → rummage-4.22}/mkdocs.yml +1 -1
- {rummage-4.21.2 → rummage-4.22}/pyproject.toml +2 -2
- {rummage-4.21.2 → rummage-4.22}/requirements/extras.txt +1 -1
- {rummage-4.21.2 → rummage-4.22}/requirements/project.txt +6 -6
- {rummage-4.21.2 → rummage-4.22}/requirements/test-project.txt +1 -1
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/__meta__.py +1 -1
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/rummage_app.py +0 -5
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/result_lists.py +16 -12
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/about/changelog.html +9 -1
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/extras.html +6 -6
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/preferences.html +1 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/usage.html +15 -15
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/delete_dialog.py +25 -9
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/rummage_dialog.py +33 -2
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/gui.py +9 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/localization/locale/en_US/LC_MESSAGES/rummage.po +197 -165
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/localization/locale/ru_RU/LC_MESSAGES/rummage.po +195 -165
- {rummage-4.21.2 → rummage-4.22}/.coveragerc +0 -0
- {rummage-4.21.2 → rummage-4.22}/.gitignore +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/.snippets/abbr.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/.snippets/links.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/.snippets/refs.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/about/contributing.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/about/license.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/extras.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/chain_button.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/chain_mode.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/chains.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/content_tab.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/file_pattern.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/files_tab.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/html_export.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/limit_search_panel.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/load_search.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/logo.svg +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/plugin_input.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/plugin_toggle.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/preview.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/regex_buttons.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/regex_tester.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/rummage.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/rummage.svg +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/save_search.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/search_replace_inputs.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/search_replace_panel.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/search_tab.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_backup.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_editor.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_encoding.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_export.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_general.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_history.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_import.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_notify.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_search.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/thunar-basic.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/thunar-conditions.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/thunar-custom.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/index.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/installation.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/search.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/usage.md +0 -0
- {rummage-4.21.2 → rummage-4.22}/docs/theme/announce.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/mkdocs-internal.yml +0 -0
- {rummage-4.21.2 → rummage-4.22}/requirements/docs.txt +0 -0
- {rummage-4.21.2 → rummage-4.22}/requirements/lint.txt +0 -0
- {rummage-4.21.2 → rummage-4.22}/requirements/setup.txt +0 -0
- {rummage-4.21.2 → rummage-4.22}/requirements/test.txt +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/__main__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/sum_hashes.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/tiger.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/whirlpool.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/export_csv.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/export_html.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/fileops.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/sanitize_json.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/updates.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/custom_app.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/platform_window_focus.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/autocomplete_combo.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/collapsible_pane.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/custom_statusbar.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/date_picker.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/dock_icon.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/dynamic_lists.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/encoding_list.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/file_picker.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/load_search_list.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/pick_button.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/search_chain_list.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/search_error_list.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/time_picker.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/webview.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_down.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_left.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_right.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_up.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/binary.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/doc.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/404.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/about/contributing.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/about/license.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/css/theme.css +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/chain_button.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/chain_mode.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/chains.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/content_tab.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/file_pattern.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/files_tab.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/html_export.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/limit_search_panel.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/load_search.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/logo.svg +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/plugin_input.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/plugin_toggle.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/preview.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/regex_buttons.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/regex_tester.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/rummage.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/rummage.svg +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/save_search.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/search_replace_inputs.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/search_replace_panel.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/search_tab.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_backup.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_editor.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_encoding.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_export.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_general.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_history.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_import.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_notify.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_search.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/thunar-basic.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/thunar-conditions.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/thunar-custom.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/index.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/installation.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/js/theme.js +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/search.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/sitemap.html +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/error.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/glass.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/results.css +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage.icns +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage.ico +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_1024.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_128.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_16.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_256.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_32.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_40.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_48.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_512.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_mac.png +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/sorttable.js +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/checksum_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/column_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/edit_search_chain_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/error_text_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/export_settings_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/file_ext_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/generic_dialogs.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/html_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/import_settings_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/load_search_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/msg_dialogs.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/overwrite_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/regex_test_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/save_search_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/search_chain_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/search_error_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/settings_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/support_info_dialog.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/localization/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/notify_linux.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/notify_osx.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/notify_windows.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/util.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/settings/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/colors.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/images.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/png.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/rumcore/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/rumcore/text_decode.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/rummage/lib/rumcore/util.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tests/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tests/test_rumcore.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tests/test_text_decode.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tests/test_versions.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tests/util.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tools/__init__.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tools/gen_docs.py +0 -0
- {rummage-4.21.2 → rummage-4.22}/tools/gui_patch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT license.
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2013 -
|
|
3
|
+
Copyright (c) 2013 - 2025 Isaac Muse <isaacmuse@gmail.com>
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rummage
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.22
|
|
4
4
|
Summary: A GUI search and replace app.
|
|
5
5
|
Project-URL: Homepage, https://github.com/facelessuser/Rummage
|
|
6
6
|
Author-email: Isaac Muse <Isaac.Muse@gmail.com>
|
|
@@ -13,7 +13,6 @@ Classifier: Intended Audience :: Developers
|
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
14
14
|
Classifier: Operating System :: OS Independent
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.9
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -23,25 +22,24 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
|
23
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
23
|
Classifier: Topic :: Text Processing :: Filters
|
|
25
24
|
Classifier: Topic :: Text Processing :: Markup :: HTML
|
|
26
|
-
Requires-Python: >=3.
|
|
27
|
-
Requires-Dist: backrefs>=
|
|
28
|
-
Requires-Dist: bracex>=2.
|
|
25
|
+
Requires-Python: >=3.9
|
|
26
|
+
Requires-Dist: backrefs>=6.0.1
|
|
27
|
+
Requires-Dist: bracex>=2.6
|
|
29
28
|
Requires-Dist: chardet>=5.1.0
|
|
30
|
-
Requires-Dist: coloraide>=4.
|
|
29
|
+
Requires-Dist: coloraide>=4.7.2
|
|
31
30
|
Requires-Dist: filelock>=3.16
|
|
32
|
-
Requires-Dist: markdown>=3.
|
|
33
|
-
Requires-Dist: pygments>=2.
|
|
34
|
-
Requires-Dist: pymdown-extensions>=10.
|
|
31
|
+
Requires-Dist: markdown>=3.8.2
|
|
32
|
+
Requires-Dist: pygments>=2.19.2
|
|
33
|
+
Requires-Dist: pymdown-extensions>=10.16.1
|
|
35
34
|
Requires-Dist: send2trash>=1.8.3
|
|
36
35
|
Requires-Dist: wcmatch<11.0,>=10.0
|
|
37
36
|
Requires-Dist: wxpython>=4.1.0
|
|
38
37
|
Provides-Extra: extras
|
|
39
38
|
Requires-Dist: faust-cchardet>=2.1.18; extra == 'extras'
|
|
40
|
-
Requires-Dist: regex>=
|
|
39
|
+
Requires-Dist: regex>=2025.7.34; extra == 'extras'
|
|
41
40
|
Description-Content-Type: text/markdown
|
|
42
41
|
|
|
43
42
|
[![Donate via PayPal][donate-image]][donate-link]
|
|
44
|
-
[![Build][github-ci-image]][github-ci-link]
|
|
45
43
|
[![Coverage][codecov-image]][codecov-link]
|
|
46
44
|
[![PyPI Version][pypi-image]][pypi-link]
|
|
47
45
|
[![PyPI - Python Version][python-image]][pypi-link]
|
|
@@ -72,8 +70,6 @@ License
|
|
|
72
70
|
|
|
73
71
|
Rummage is released under the MIT license.
|
|
74
72
|
|
|
75
|
-
[github-ci-image]: https://github.com/facelessuser/Rummage/workflows/build/badge.svg
|
|
76
|
-
[github-ci-link]: https://github.com/facelessuser/Rummage/actions?workflow=build
|
|
77
73
|
[codecov-image]: https://img.shields.io/codecov/c/github/facelessuser/Rummage/master.svg?logo=codecov&logoColor=aaaaaa&labelColor=333333
|
|
78
74
|
[codecov-link]: https://codecov.io/github/facelessuser/Rummage
|
|
79
75
|
[pypi-image]: https://img.shields.io/pypi/v/Rummage.svg?logo=pypi&logoColor=aaaaaa&labelColor=333333
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
[![Donate via PayPal][donate-image]][donate-link]
|
|
2
|
-
[![Build][github-ci-image]][github-ci-link]
|
|
3
2
|
[![Coverage][codecov-image]][codecov-link]
|
|
4
3
|
[![PyPI Version][pypi-image]][pypi-link]
|
|
5
4
|
[![PyPI - Python Version][python-image]][pypi-link]
|
|
@@ -30,8 +29,6 @@ License
|
|
|
30
29
|
|
|
31
30
|
Rummage is released under the MIT license.
|
|
32
31
|
|
|
33
|
-
[github-ci-image]: https://github.com/facelessuser/Rummage/workflows/build/badge.svg
|
|
34
|
-
[github-ci-link]: https://github.com/facelessuser/Rummage/actions?workflow=build
|
|
35
32
|
[codecov-image]: https://img.shields.io/codecov/c/github/facelessuser/Rummage/master.svg?logo=codecov&logoColor=aaaaaa&labelColor=333333
|
|
36
33
|
[codecov-link]: https://codecov.io/github/facelessuser/Rummage
|
|
37
34
|
[pypi-image]: https://img.shields.io/pypi/v/Rummage.svg?logo=pypi&logoColor=aaaaaa&labelColor=333333
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.22
|
|
4
|
+
|
|
5
|
+
- **NEW**: Drop Python 3.8 support.
|
|
6
|
+
- **NEW**: Upgrade dependencies to pick up bug fixes.
|
|
7
|
+
- **NEW**: Add a command under the main menu to delete backups recursively under the current working directory.
|
|
8
|
+
- **FIX**: Custom focus is not needed to focus the app from macOS dock anymore.
|
|
9
|
+
- **FIX**: Fix some issues with context menu right click selection in list controls.
|
|
10
|
+
|
|
3
11
|
## 4.21.2
|
|
4
12
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
13
|
+
- **FIX**: Use a different wxPython time control on macOS as the previous one would crash on the M series chips.
|
|
14
|
+
- **FIX**: Fix an issue with local time to UTC conversion.
|
|
15
|
+
- **FIX**: Fix an issue where created time comparisons was actually being done on modified times.
|
|
8
16
|
|
|
9
17
|
## 4.21.1
|
|
10
18
|
|
|
@@ -186,6 +186,8 @@ The **Backups** panel allows you to configure where Rummage creates backups. You
|
|
|
186
186
|
placed in the same folder as the original source, or if they are put into a subfolder. You can also configure the name
|
|
187
187
|
of the subfolder used or the extension used when not writing to a subfolder.
|
|
188
188
|
|
|
189
|
+
If you need to quickly delete all backups, you can select `File -> Delete Backups` from the main menu.
|
|
190
|
+
|
|
189
191
|
## Import/Export Settings
|
|
190
192
|
|
|
191
193
|
If desired, Rummage's settings can be exported to a JSON file or imported from a JSON file. This can be particularly
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
2
2
|
<wxFormBuilder_Project>
|
|
3
3
|
<FileVersion major="1" minor="18"/>
|
|
4
|
-
<object class="Project" expanded="
|
|
4
|
+
<object class="Project" expanded="false">
|
|
5
5
|
<property name="code_generation">Python</property>
|
|
6
6
|
<property name="cpp_class_decoration"></property>
|
|
7
7
|
<property name="cpp_disconnect_events">1</property>
|
|
@@ -5103,6 +5103,24 @@
|
|
|
5103
5103
|
<property name="name">m_separator41</property>
|
|
5104
5104
|
<property name="permission">none</property>
|
|
5105
5105
|
</object>
|
|
5106
|
+
<object class="wxMenuItem" expanded="false">
|
|
5107
|
+
<property name="bitmap"></property>
|
|
5108
|
+
<property name="checked">0</property>
|
|
5109
|
+
<property name="enabled">1</property>
|
|
5110
|
+
<property name="help"></property>
|
|
5111
|
+
<property name="id">wxID_ANY</property>
|
|
5112
|
+
<property name="kind">wxITEM_NORMAL</property>
|
|
5113
|
+
<property name="label">Delete Backups</property>
|
|
5114
|
+
<property name="name">m_delete_backups_menuitem</property>
|
|
5115
|
+
<property name="permission">none</property>
|
|
5116
|
+
<property name="shortcut"></property>
|
|
5117
|
+
<property name="unchecked_bitmap"></property>
|
|
5118
|
+
<event name="OnMenuSelection">on_delete_backups</event>
|
|
5119
|
+
</object>
|
|
5120
|
+
<object class="separator" expanded="false">
|
|
5121
|
+
<property name="name">m_separator5</property>
|
|
5122
|
+
<property name="permission">none</property>
|
|
5123
|
+
</object>
|
|
5106
5124
|
<object class="wxMenuItem" expanded="false">
|
|
5107
5125
|
<property name="bitmap"></property>
|
|
5108
5126
|
<property name="checked">0</property>
|
|
@@ -43,7 +43,6 @@ class CustomMetadataHook(MetadataHookInterface):
|
|
|
43
43
|
"License :: OSI Approved :: MIT License",
|
|
44
44
|
"Operating System :: OS Independent",
|
|
45
45
|
"Programming Language :: Python :: 3",
|
|
46
|
-
"Programming Language :: Python :: 3.8",
|
|
47
46
|
"Programming Language :: Python :: 3.9",
|
|
48
47
|
"Programming Language :: Python :: 3.10",
|
|
49
48
|
"Programming Language :: Python :: 3.11",
|
|
@@ -4,7 +4,7 @@ repo_url: https://github.com/facelessuser/Rummage
|
|
|
4
4
|
edit_uri: tree/master/docs/src/markdown
|
|
5
5
|
site_description: A search and replace tool written in Python.
|
|
6
6
|
copyright: |
|
|
7
|
-
Copyright © 2013 -
|
|
7
|
+
Copyright © 2013 - 2025 <a href="https://github.com/facelessuser" target="_blank" rel="noopener">Isaac Muse</a>
|
|
8
8
|
|
|
9
9
|
docs_dir: docs/src/markdown
|
|
10
10
|
theme:
|
|
@@ -9,7 +9,7 @@ name = "rummage"
|
|
|
9
9
|
description = "A GUI search and replace app."
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
license = "MIT"
|
|
12
|
-
requires-python = ">=3.
|
|
12
|
+
requires-python = ">=3.9"
|
|
13
13
|
authors = [
|
|
14
14
|
{ name = "Isaac Muse", email = "Isaac.Muse@gmail.com" },
|
|
15
15
|
]
|
|
@@ -153,7 +153,7 @@ legacy_tox_ini = """
|
|
|
153
153
|
[tox]
|
|
154
154
|
skipsdist=true
|
|
155
155
|
envlist=
|
|
156
|
-
{
|
|
156
|
+
{py39,py310,py311,py312,py313},
|
|
157
157
|
lint
|
|
158
158
|
|
|
159
159
|
[testenv]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
faust-cchardet>=2.1.18
|
|
2
|
-
regex>=
|
|
2
|
+
regex>=2025.7.34
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
chardet>=5.1.0
|
|
2
|
-
backrefs>=
|
|
3
|
-
bracex>=2.
|
|
2
|
+
backrefs>=6.0.1
|
|
3
|
+
bracex>=2.6
|
|
4
4
|
wcmatch>=10.0,<11.0
|
|
5
5
|
wxpython>=4.1.0
|
|
6
6
|
filelock>=3.16
|
|
7
7
|
send2trash>=1.8.3
|
|
8
|
-
markdown>=3.
|
|
9
|
-
pymdown-extensions>=10.
|
|
10
|
-
pygments>=2.
|
|
11
|
-
coloraide>=4.
|
|
8
|
+
markdown>=3.8.2
|
|
9
|
+
pymdown-extensions>=10.16.1
|
|
10
|
+
pygments>=2.19.2
|
|
11
|
+
coloraide>=4.7.2
|
|
@@ -189,7 +189,7 @@ def parse_version(ver):
|
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
# (major, minor, micro, release type, pre-release build, post-release build, development-release)
|
|
192
|
-
__version_info__ = Version(4,
|
|
192
|
+
__version_info__ = Version(4, 22, 0, 'final')
|
|
193
193
|
__version__ = __version_info__._get_canonical()
|
|
194
194
|
__app__ = "Rummage"
|
|
195
195
|
__status__ = __version_info__[3]
|
|
@@ -136,10 +136,5 @@ class RummageApp(PipeApp):
|
|
|
136
136
|
def MacNewFile(self, fileName=None):
|
|
137
137
|
"""Handle new window event."""
|
|
138
138
|
|
|
139
|
-
self.MacReopenApp()
|
|
140
|
-
|
|
141
|
-
def MacReopenApp(self): # noqa
|
|
142
|
-
"""Ensure that app will be un-minimized in macOS on dock icon click."""
|
|
143
|
-
|
|
144
139
|
frame = self.GetTopWindow()
|
|
145
140
|
platform_window_focus(frame)
|
|
@@ -60,6 +60,13 @@ COPY_PATH = 1
|
|
|
60
60
|
COPY_CONTENT = 2
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
def display_menu(obj, m, p):
|
|
64
|
+
"""Display menu."""
|
|
65
|
+
|
|
66
|
+
obj.PopupMenu(m, p)
|
|
67
|
+
m.Destroy()
|
|
68
|
+
|
|
69
|
+
|
|
63
70
|
class ContextMenu(wx.Menu):
|
|
64
71
|
"""Context Menu."""
|
|
65
72
|
|
|
@@ -490,10 +497,9 @@ class ResultFileList(CommonOperationsMixin, DynamicList):
|
|
|
490
497
|
# Select if not already
|
|
491
498
|
if not selected:
|
|
492
499
|
s = self.GetFirstSelected()
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
s = self.GetNextSelected(s)
|
|
500
|
+
if s == -1:
|
|
501
|
+
self.Select(item, True)
|
|
502
|
+
|
|
497
503
|
if target is not None:
|
|
498
504
|
if not enabled:
|
|
499
505
|
item = -1
|
|
@@ -522,8 +528,8 @@ class ResultFileList(CommonOperationsMixin, DynamicList):
|
|
|
522
528
|
)
|
|
523
529
|
]
|
|
524
530
|
)
|
|
525
|
-
|
|
526
|
-
|
|
531
|
+
|
|
532
|
+
wx.CallLater(1, lambda obj=self, m=menu, p=pos: display_menu(obj, m, p))
|
|
527
533
|
event.Skip()
|
|
528
534
|
|
|
529
535
|
|
|
@@ -807,10 +813,9 @@ class ResultContentList(CommonOperationsMixin, DynamicList):
|
|
|
807
813
|
# Select if not already
|
|
808
814
|
if not selected:
|
|
809
815
|
s = self.GetFirstSelected()
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
s = self.GetNextSelected(s)
|
|
816
|
+
if s == -1:
|
|
817
|
+
self.Select(item, True)
|
|
818
|
+
|
|
814
819
|
if target is not None:
|
|
815
820
|
if not enabled:
|
|
816
821
|
item = -1
|
|
@@ -840,6 +845,5 @@ class ResultContentList(CommonOperationsMixin, DynamicList):
|
|
|
840
845
|
)
|
|
841
846
|
]
|
|
842
847
|
)
|
|
843
|
-
|
|
844
|
-
menu.Destroy()
|
|
848
|
+
wx.CallLater(1, lambda obj=self, m=menu, p=pos: display_menu(obj, m, p))
|
|
845
849
|
event.Skip()
|
|
@@ -25,6 +25,14 @@
|
|
|
25
25
|
|
|
26
26
|
<!-- Table of Content (Don't show for static sites) -->
|
|
27
27
|
<h1 id="changelog">Changelog</h1>
|
|
28
|
+
<h2 id="422">4.22</h2>
|
|
29
|
+
<ul>
|
|
30
|
+
<li><strong>NEW</strong>: Drop Python 3.8 support.</li>
|
|
31
|
+
<li><strong>NEW</strong>: Upgrade dependencies to pick up bug fixes.</li>
|
|
32
|
+
<li><strong>NEW</strong>: Add a command under the main menu to delete backups recursively under the current working directory.</li>
|
|
33
|
+
<li><strong>FIX</strong>: Custom focus is not needed to focus the app from macOS dock anymore.</li>
|
|
34
|
+
<li><strong>FIX</strong>: Fix some issues with context menu right click selection in list controls.</li>
|
|
35
|
+
</ul>
|
|
28
36
|
<h2 id="4212">4.21.2</h2>
|
|
29
37
|
<ul>
|
|
30
38
|
<li><strong>FIX</strong>: Use a different wxPython time control on macOS as the previous one would crash on the M series chips.</li>
|
|
@@ -316,7 +324,7 @@ unawares.</p>
|
|
|
316
324
|
<li><strong>FIX</strong>: Process preview in regular expression test dialog when replace pattern is empty. If replace plugin is
|
|
317
325
|
enabled, we must have a plugin specified.</li>
|
|
318
326
|
</ul>
|
|
319
|
-
<h2 id="
|
|
327
|
+
<h2 id="422_1">4.2.2</h2>
|
|
320
328
|
<ul>
|
|
321
329
|
<li><strong>FIX</strong>: Don't open another update notification if one is already open.</li>
|
|
322
330
|
</ul>
|
|
@@ -132,13 +132,13 @@ are doing.</p>
|
|
|
132
132
|
<span class="na">@</span><span class="o">=</span><span class="s">""</span>
|
|
133
133
|
|
|
134
134
|
<span class="k">[HKEY_CLASSES_ROOT\Folder\shell\Rummage Here...\command]</span>
|
|
135
|
-
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"
|
|
135
|
+
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"</span><span class="na">%1\""</span>
|
|
136
136
|
|
|
137
137
|
<span class="k">[HKEY_CLASSES_ROOT\*\shell\Rummage Here...]</span>
|
|
138
138
|
<span class="na">@</span><span class="o">=</span><span class="s">""</span>
|
|
139
139
|
|
|
140
140
|
<span class="k">[HKEY_CLASSES_ROOT\*\shell\Rummage Here...\command]</span>
|
|
141
|
-
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"
|
|
141
|
+
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"</span><span class="na">%1\""</span>
|
|
142
142
|
</code></pre></div>
|
|
143
143
|
<p>Optionally, you can also include the Rummage icon beside your context menu entry by adding a few additional lines:</p>
|
|
144
144
|
<div class="highlight"><pre><span></span><code><span class="na">Windows Registry Editor Version 5.00</span>
|
|
@@ -148,14 +148,14 @@ are doing.</p>
|
|
|
148
148
|
<span class="na">"Icon"</span><span class="o">=</span><span class="s">"<python_install_path>\\Lib\\site-packages\\rummage\\lib\\gui\\data\\rummage.ico"</span>
|
|
149
149
|
|
|
150
150
|
<span class="k">[HKEY_CLASSES_ROOT\Folder\shell\Rummage Here...\command]</span>
|
|
151
|
-
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"
|
|
151
|
+
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"</span><span class="na">%1\""</span>
|
|
152
152
|
|
|
153
153
|
<span class="k">[HKEY_CLASSES_ROOT\*\shell\Rummage Here...]</span>
|
|
154
154
|
<span class="na">@</span><span class="o">=</span><span class="s">""</span>
|
|
155
155
|
<span class="na">"Icon"</span><span class="o">=</span><span class="s">"<python_install_path>\\Lib\\site-packages\\rummage\\lib\\gui\\data\\rummage.ico"</span>
|
|
156
156
|
|
|
157
157
|
<span class="k">[HKEY_CLASSES_ROOT\*\shell\Rummage Here...\command]</span>
|
|
158
|
-
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"
|
|
158
|
+
<span class="na">@</span><span class="o">=</span><span class="s">"<python_install_path>\\Scripts\\rummage.exe --path \"</span><span class="na">%1\""</span>
|
|
159
159
|
</code></pre></div>
|
|
160
160
|
</li>
|
|
161
161
|
<li>
|
|
@@ -175,8 +175,8 @@ like to include the info here, please issue a pull request to update the documen
|
|
|
175
175
|
(RUMMAGE_PATH should be the binary created when installing rummage in Python which is usually
|
|
176
176
|
<code>/usr/local/bin/rummage</code>).</p>
|
|
177
177
|
<div class="highlight"><pre><span></span><code><span class="ch">#!/usr/bin/python</span>
|
|
178
|
-
<span class="kn">import</span>
|
|
179
|
-
<span class="kn">import</span>
|
|
178
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
|
|
179
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
|
|
180
180
|
|
|
181
181
|
<span class="n">RUMMAGE_PATH</span> <span class="o">=</span> <span class="s2">"/usr/local/bin/rummage"</span>
|
|
182
182
|
|
|
@@ -252,6 +252,7 @@ to access the binary inside the bundle.</p>
|
|
|
252
252
|
<p>The <strong>Backups</strong> panel allows you to configure where Rummage creates backups. You can control whether backups are all
|
|
253
253
|
placed in the same folder as the original source, or if they are put into a subfolder. You can also configure the name
|
|
254
254
|
of the subfolder used or the extension used when not writing to a subfolder.</p>
|
|
255
|
+
<p>If you need to quickly delete all backups, you can select <code>File -> Delete Backups</code> from the main menu.</p>
|
|
255
256
|
<h2 id="importexport-settings">Import/Export Settings</h2>
|
|
256
257
|
<p>If desired, Rummage's settings can be exported to a <abbr title="JavaScript Object Notation">JSON</abbr> file or imported from a <abbr title="JavaScript Object Notation">JSON</abbr> file. This can be particularly
|
|
257
258
|
useful for importing regular expression patterns from one system into another system's existing regular expression list.
|
|
@@ -221,40 +221,40 @@ environment.</p>
|
|
|
221
221
|
<li>A function called <code>get_replace</code> that returns your class.</li>
|
|
222
222
|
</ol>
|
|
223
223
|
<p>The plugin class is fairly straight forward and is shown below.</p>
|
|
224
|
-
<div class="highlight"><pre><span></span><code><span class="k">class</span>
|
|
224
|
+
<div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">ReplacePlugin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
225
225
|
<span class="w"> </span><span class="sd">"""Rummage replace plugin."""</span>
|
|
226
226
|
|
|
227
|
-
<span class="k">def</span>
|
|
227
|
+
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_info</span><span class="p">,</span> <span class="n">flags</span><span class="p">):</span>
|
|
228
228
|
<span class="w"> </span><span class="sd">"""Initialize."""</span>
|
|
229
229
|
|
|
230
230
|
<span class="bp">self</span><span class="o">.</span><span class="n">file_info</span> <span class="o">=</span> <span class="n">file_info</span>
|
|
231
231
|
<span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span>
|
|
232
232
|
<span class="bp">self</span><span class="o">.</span><span class="n">on_init</span><span class="p">()</span>
|
|
233
233
|
|
|
234
|
-
<span class="k">def</span>
|
|
234
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">on_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
235
235
|
<span class="w"> </span><span class="sd">"""Override this function to add initialization setup."""</span>
|
|
236
236
|
|
|
237
|
-
<span class="k">def</span>
|
|
237
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">get_flags</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
238
238
|
<span class="w"> </span><span class="sd">"""Get flags."""</span>
|
|
239
239
|
|
|
240
240
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span>
|
|
241
241
|
|
|
242
|
-
<span class="k">def</span>
|
|
242
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">get_file_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
243
243
|
<span class="w"> </span><span class="sd">"""Get file name."""</span>
|
|
244
244
|
|
|
245
245
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_info</span><span class="o">.</span><span class="n">name</span>
|
|
246
246
|
|
|
247
|
-
<span class="k">def</span>
|
|
247
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">is_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
248
248
|
<span class="w"> </span><span class="sd">"""Is a binary search."""</span>
|
|
249
249
|
|
|
250
250
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_info</span><span class="o">.</span><span class="n">encoding</span><span class="o">.</span><span class="n">encode</span> <span class="o">==</span> <span class="s1">'bin'</span>
|
|
251
251
|
|
|
252
|
-
<span class="k">def</span>
|
|
252
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">is_literal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
253
253
|
<span class="w"> </span><span class="sd">"""Is a literal search."""</span>
|
|
254
254
|
|
|
255
255
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">&</span> <span class="n">LITERAL</span>
|
|
256
256
|
|
|
257
|
-
<span class="k">def</span>
|
|
257
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">replace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
|
|
258
258
|
<span class="w"> </span><span class="sd">"""Make replacement."""</span>
|
|
259
259
|
|
|
260
260
|
<span class="k">return</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
|
@@ -264,7 +264,7 @@ environment.</p>
|
|
|
264
264
|
string (for binary files).</p>
|
|
265
265
|
<p>The <code>ReplacePlugin</code>'s <code>file_info</code> property is a named tuple providing information about the current file such as name,
|
|
266
266
|
size, creation date, etc.</p>
|
|
267
|
-
<div class="highlight"><pre><span></span><code><span class="k">class</span>
|
|
267
|
+
<div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">FileInfoRecord</span><span class="p">(</span><span class="n">namedtuple</span><span class="p">(</span><span class="s1">'FileInfoRecord'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'id'</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">,</span> <span class="s1">'size'</span><span class="p">,</span> <span class="s1">'modified'</span><span class="p">,</span> <span class="s1">'created'</span><span class="p">,</span> <span class="s1">'encoding'</span><span class="p">])):</span>
|
|
268
268
|
<span class="w"> </span><span class="sd">"""A record for tracking file info."""</span>
|
|
269
269
|
</code></pre></div>
|
|
270
270
|
<p>The <code>ReplacePlugin</code>'s <code>flags</code> property contains only Rummage search related flags (the flags are abstracted at this
|
|
@@ -295,22 +295,22 @@ level and are converted to the appropriate regular expression flags later). They
|
|
|
295
295
|
<p class="admonition-title">Example Plugin</p>
|
|
296
296
|
<p>In the example below, we have a replace plugin that replaces the search result with the name of the file. It is
|
|
297
297
|
assumed this is not a binary replace, so a Unicode string is returned.</p>
|
|
298
|
-
<div class="highlight"><pre><span></span><code><span class="kn">from</span>
|
|
299
|
-
<span class="kn">from</span>
|
|
300
|
-
<span class="kn">import</span>
|
|
298
|
+
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">__future__</span><span class="w"> </span><span class="kn">import</span> <span class="n">unicode_literals</span>
|
|
299
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">rummage.lib</span><span class="w"> </span><span class="kn">import</span> <span class="n">rumcore</span>
|
|
300
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
|
|
301
301
|
|
|
302
302
|
|
|
303
|
-
<span class="k">class</span>
|
|
303
|
+
<span class="k">class</span><span class="w"> </span><span class="nc">TestReplace</span><span class="p">(</span><span class="n">rumcore</span><span class="o">.</span><span class="n">ReplacePlugin</span><span class="p">):</span>
|
|
304
304
|
<span class="w"> </span><span class="sd">"""Replace object."""</span>
|
|
305
305
|
|
|
306
|
-
<span class="k">def</span>
|
|
306
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">replace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
|
|
307
307
|
<span class="w"> </span><span class="sd">"""Replace method."""</span>
|
|
308
308
|
|
|
309
309
|
<span class="n">name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_file_name</span><span class="p">())</span>
|
|
310
310
|
<span class="k">return</span> <span class="n">name</span>
|
|
311
311
|
|
|
312
312
|
|
|
313
|
-
<span class="k">def</span>
|
|
313
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">get_replace</span><span class="p">():</span>
|
|
314
314
|
<span class="w"> </span><span class="sd">"""Get the replace object."""</span>
|
|
315
315
|
|
|
316
316
|
<span class="k">return</span> <span class="n">TestReplace</span>
|
|
@@ -21,6 +21,7 @@ IN THE SOFTWARE.
|
|
|
21
21
|
import wx
|
|
22
22
|
import os
|
|
23
23
|
import time
|
|
24
|
+
import shutil
|
|
24
25
|
import threading
|
|
25
26
|
from ..localization import _
|
|
26
27
|
from .. import gui
|
|
@@ -68,7 +69,10 @@ class DeleteThread(threading.Thread):
|
|
|
68
69
|
if self.recycle:
|
|
69
70
|
send2trash(self.trouble_file)
|
|
70
71
|
else:
|
|
71
|
-
os.
|
|
72
|
+
if os.path.isdir(self.trouble_file):
|
|
73
|
+
shutil.rmtree(self.trouble_file)
|
|
74
|
+
else:
|
|
75
|
+
os.remove(self.trouble_file)
|
|
72
76
|
deleted = True
|
|
73
77
|
self.trouble_file = None
|
|
74
78
|
except Exception:
|
|
@@ -88,7 +92,10 @@ class DeleteThread(threading.Thread):
|
|
|
88
92
|
if self.recycle:
|
|
89
93
|
send2trash(f)
|
|
90
94
|
else:
|
|
91
|
-
os.
|
|
95
|
+
if os.path.isdir(f):
|
|
96
|
+
shutil.rmtree(f)
|
|
97
|
+
else:
|
|
98
|
+
os.remove(f)
|
|
92
99
|
self.count += 1
|
|
93
100
|
except Exception:
|
|
94
101
|
self.trouble_file = f
|
|
@@ -115,7 +122,7 @@ class DeleteDialog(gui.DeleteDialog):
|
|
|
115
122
|
self.file = None
|
|
116
123
|
self.busy = False
|
|
117
124
|
self.thread = None
|
|
118
|
-
self.total = len(file_list)
|
|
125
|
+
self.total = len(file_list) if isinstance(file_list, list) else 0
|
|
119
126
|
self.message = None
|
|
120
127
|
self.processing = False
|
|
121
128
|
self.handling = False
|
|
@@ -128,15 +135,18 @@ class DeleteDialog(gui.DeleteDialog):
|
|
|
128
135
|
title = None
|
|
129
136
|
if self.action == ACTION_DELETE:
|
|
130
137
|
title = _("Deleting Files")
|
|
131
|
-
self.message = _("Deleting %d/%d...")
|
|
138
|
+
self.message = _("Deleting %d/%d...") if self.total else _("Deleting %d...")
|
|
132
139
|
elif self.action == ACTION_RECYCLE:
|
|
133
140
|
title = _("Recycling Files")
|
|
134
|
-
self.message = _("Recycling %d/%d...")
|
|
141
|
+
self.message = _("Recycling %d/%d...") if self.total else _("Recycling %d...")
|
|
135
142
|
|
|
136
143
|
self.localize()
|
|
137
144
|
self.refresh_localization(title)
|
|
138
145
|
if self.message:
|
|
139
|
-
|
|
146
|
+
if self.total:
|
|
147
|
+
self.m_progress_label.SetLabel(self.message % (0, self.total))
|
|
148
|
+
else:
|
|
149
|
+
self.m_progress_label.SetLabel(self.message % 0)
|
|
140
150
|
|
|
141
151
|
# Ensure good sizing of frame
|
|
142
152
|
self.m_progress.SetValue(0)
|
|
@@ -198,10 +208,13 @@ class DeleteDialog(gui.DeleteDialog):
|
|
|
198
208
|
if self.processing and not self.handling:
|
|
199
209
|
self.handling = True
|
|
200
210
|
count = self.thread.count
|
|
201
|
-
ratio = float(count) / float(self.total)
|
|
211
|
+
ratio = (float(count) / float(self.total)) if self.total else 0
|
|
202
212
|
percent = int(ratio * 100)
|
|
203
213
|
self.m_progress.SetValue(percent)
|
|
204
|
-
|
|
214
|
+
if self.total:
|
|
215
|
+
self.m_progress_label.SetLabel(self.message % (count, self.total))
|
|
216
|
+
else:
|
|
217
|
+
self.m_progress_label.SetLabel(self.message % count)
|
|
205
218
|
|
|
206
219
|
if self.thread.request is True:
|
|
207
220
|
self.thread.request = False
|
|
@@ -226,7 +239,10 @@ class DeleteDialog(gui.DeleteDialog):
|
|
|
226
239
|
if not self.thread.is_alive():
|
|
227
240
|
self.processing = False
|
|
228
241
|
self.m_progress.SetValue(100)
|
|
229
|
-
|
|
242
|
+
if self.total:
|
|
243
|
+
self.m_progress_label.SetLabel(self.message % (self.thread.count, self.total))
|
|
244
|
+
else:
|
|
245
|
+
self.m_progress_label.SetLabel(self.message % self.thread.count)
|
|
230
246
|
|
|
231
247
|
if not self.thread.abort:
|
|
232
248
|
if self.thread.errors:
|