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.
Files changed (213) hide show
  1. {rummage-4.21.2 → rummage-4.22}/LICENSE.md +1 -1
  2. {rummage-4.21.2 → rummage-4.22}/PKG-INFO +9 -13
  3. {rummage-4.21.2 → rummage-4.22}/README.md +0 -3
  4. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/about/changelog.md +11 -3
  5. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/preferences.md +2 -0
  6. {rummage-4.21.2 → rummage-4.22}/gui.fbp +19 -1
  7. {rummage-4.21.2 → rummage-4.22}/hatch_build.py +0 -1
  8. {rummage-4.21.2 → rummage-4.22}/mkdocs.yml +1 -1
  9. {rummage-4.21.2 → rummage-4.22}/pyproject.toml +2 -2
  10. {rummage-4.21.2 → rummage-4.22}/requirements/extras.txt +1 -1
  11. {rummage-4.21.2 → rummage-4.22}/requirements/project.txt +6 -6
  12. {rummage-4.21.2 → rummage-4.22}/requirements/test-project.txt +1 -1
  13. {rummage-4.21.2 → rummage-4.22}/rummage/lib/__meta__.py +1 -1
  14. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/rummage_app.py +0 -5
  15. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/result_lists.py +16 -12
  16. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/about/changelog.html +9 -1
  17. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/extras.html +6 -6
  18. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/preferences.html +1 -0
  19. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/usage.html +15 -15
  20. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/delete_dialog.py +25 -9
  21. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/rummage_dialog.py +33 -2
  22. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/gui.py +9 -0
  23. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/localization/locale/en_US/LC_MESSAGES/rummage.po +197 -165
  24. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/localization/locale/ru_RU/LC_MESSAGES/rummage.po +195 -165
  25. {rummage-4.21.2 → rummage-4.22}/.coveragerc +0 -0
  26. {rummage-4.21.2 → rummage-4.22}/.gitignore +0 -0
  27. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/.snippets/abbr.md +0 -0
  28. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/.snippets/links.md +0 -0
  29. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/.snippets/refs.md +0 -0
  30. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/about/contributing.md +0 -0
  31. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/about/license.md +0 -0
  32. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/extras.md +0 -0
  33. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/chain_button.png +0 -0
  34. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/chain_mode.png +0 -0
  35. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/chains.png +0 -0
  36. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/content_tab.png +0 -0
  37. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/file_pattern.png +0 -0
  38. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/files_tab.png +0 -0
  39. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/html_export.png +0 -0
  40. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/limit_search_panel.png +0 -0
  41. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/load_search.png +0 -0
  42. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/logo.svg +0 -0
  43. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/plugin_input.png +0 -0
  44. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/plugin_toggle.png +0 -0
  45. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/preview.png +0 -0
  46. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/regex_buttons.png +0 -0
  47. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/regex_tester.png +0 -0
  48. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/rummage.png +0 -0
  49. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/rummage.svg +0 -0
  50. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/save_search.png +0 -0
  51. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/search_replace_inputs.png +0 -0
  52. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/search_replace_panel.png +0 -0
  53. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/search_tab.png +0 -0
  54. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_backup.png +0 -0
  55. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_editor.png +0 -0
  56. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_encoding.png +0 -0
  57. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_export.png +0 -0
  58. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_general.png +0 -0
  59. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_history.png +0 -0
  60. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_import.png +0 -0
  61. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_notify.png +0 -0
  62. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/settings_search.png +0 -0
  63. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/thunar-basic.png +0 -0
  64. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/thunar-conditions.png +0 -0
  65. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/images/thunar-custom.png +0 -0
  66. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/index.md +0 -0
  67. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/installation.md +0 -0
  68. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/search.md +0 -0
  69. {rummage-4.21.2 → rummage-4.22}/docs/src/markdown/usage.md +0 -0
  70. {rummage-4.21.2 → rummage-4.22}/docs/theme/announce.html +0 -0
  71. {rummage-4.21.2 → rummage-4.22}/mkdocs-internal.yml +0 -0
  72. {rummage-4.21.2 → rummage-4.22}/requirements/docs.txt +0 -0
  73. {rummage-4.21.2 → rummage-4.22}/requirements/lint.txt +0 -0
  74. {rummage-4.21.2 → rummage-4.22}/requirements/setup.txt +0 -0
  75. {rummage-4.21.2 → rummage-4.22}/requirements/test.txt +0 -0
  76. {rummage-4.21.2 → rummage-4.22}/rummage/__init__.py +0 -0
  77. {rummage-4.21.2 → rummage-4.22}/rummage/__main__.py +0 -0
  78. {rummage-4.21.2 → rummage-4.22}/rummage/lib/__init__.py +0 -0
  79. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/__init__.py +0 -0
  80. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/__init__.py +0 -0
  81. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/__init__.py +0 -0
  82. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/sum_hashes.py +0 -0
  83. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/tiger.py +0 -0
  84. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/checksum/whirlpool.py +0 -0
  85. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/export_csv.py +0 -0
  86. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/export_html.py +0 -0
  87. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/fileops.py +0 -0
  88. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/sanitize_json.py +0 -0
  89. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/actions/updates.py +0 -0
  90. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/__init__.py +0 -0
  91. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/custom_app.py +0 -0
  92. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/app/platform_window_focus.py +0 -0
  93. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/__init__.py +0 -0
  94. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/autocomplete_combo.py +0 -0
  95. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/collapsible_pane.py +0 -0
  96. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/custom_statusbar.py +0 -0
  97. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/date_picker.py +0 -0
  98. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/dock_icon.py +0 -0
  99. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/dynamic_lists.py +0 -0
  100. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/encoding_list.py +0 -0
  101. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/file_picker.py +0 -0
  102. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/load_search_list.py +0 -0
  103. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/pick_button.py +0 -0
  104. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/search_chain_list.py +0 -0
  105. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/search_error_list.py +0 -0
  106. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/time_picker.py +0 -0
  107. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/controls/webview.py +0 -0
  108. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/__init__.py +0 -0
  109. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_down.png +0 -0
  110. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_left.png +0 -0
  111. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_right.png +0 -0
  112. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/arrow_up.png +0 -0
  113. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/binary.png +0 -0
  114. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/doc.png +0 -0
  115. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/404.html +0 -0
  116. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/about/contributing.html +0 -0
  117. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/about/license.html +0 -0
  118. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/css/theme.css +0 -0
  119. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/chain_button.png +0 -0
  120. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/chain_mode.png +0 -0
  121. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/chains.png +0 -0
  122. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/content_tab.png +0 -0
  123. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/file_pattern.png +0 -0
  124. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/files_tab.png +0 -0
  125. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/html_export.png +0 -0
  126. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/limit_search_panel.png +0 -0
  127. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/load_search.png +0 -0
  128. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/logo.svg +0 -0
  129. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/plugin_input.png +0 -0
  130. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/plugin_toggle.png +0 -0
  131. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/preview.png +0 -0
  132. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/regex_buttons.png +0 -0
  133. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/regex_tester.png +0 -0
  134. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/rummage.png +0 -0
  135. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/rummage.svg +0 -0
  136. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/save_search.png +0 -0
  137. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/search_replace_inputs.png +0 -0
  138. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/search_replace_panel.png +0 -0
  139. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/search_tab.png +0 -0
  140. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_backup.png +0 -0
  141. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_editor.png +0 -0
  142. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_encoding.png +0 -0
  143. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_export.png +0 -0
  144. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_general.png +0 -0
  145. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_history.png +0 -0
  146. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_import.png +0 -0
  147. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_notify.png +0 -0
  148. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/settings_search.png +0 -0
  149. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/thunar-basic.png +0 -0
  150. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/thunar-conditions.png +0 -0
  151. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/images/thunar-custom.png +0 -0
  152. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/index.html +0 -0
  153. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/installation.html +0 -0
  154. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/js/theme.js +0 -0
  155. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/search.html +0 -0
  156. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/docs/sitemap.html +0 -0
  157. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/error.png +0 -0
  158. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/glass.png +0 -0
  159. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/results.css +0 -0
  160. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage.icns +0 -0
  161. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage.ico +0 -0
  162. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage.png +0 -0
  163. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_1024.png +0 -0
  164. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_128.png +0 -0
  165. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_16.png +0 -0
  166. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_256.png +0 -0
  167. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_32.png +0 -0
  168. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_40.png +0 -0
  169. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_48.png +0 -0
  170. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_512.png +0 -0
  171. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/rummage_mac.png +0 -0
  172. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/data/sorttable.js +0 -0
  173. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/__init__.py +0 -0
  174. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/checksum_dialog.py +0 -0
  175. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/column_dialog.py +0 -0
  176. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/edit_search_chain_dialog.py +0 -0
  177. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/error_text_dialog.py +0 -0
  178. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/export_settings_dialog.py +0 -0
  179. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/file_ext_dialog.py +0 -0
  180. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/generic_dialogs.py +0 -0
  181. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/html_dialog.py +0 -0
  182. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/import_settings_dialog.py +0 -0
  183. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/load_search_dialog.py +0 -0
  184. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/msg_dialogs.py +0 -0
  185. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/overwrite_dialog.py +0 -0
  186. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/regex_test_dialog.py +0 -0
  187. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/save_search_dialog.py +0 -0
  188. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/search_chain_dialog.py +0 -0
  189. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/search_error_dialog.py +0 -0
  190. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/settings_dialog.py +0 -0
  191. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/dialogs/support_info_dialog.py +0 -0
  192. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/localization/__init__.py +0 -0
  193. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/__init__.py +0 -0
  194. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/notify_linux.py +0 -0
  195. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/notify_osx.py +0 -0
  196. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/notify_windows.py +0 -0
  197. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/notify/util.py +0 -0
  198. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/settings/__init__.py +0 -0
  199. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/__init__.py +0 -0
  200. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/colors.py +0 -0
  201. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/images.py +0 -0
  202. {rummage-4.21.2 → rummage-4.22}/rummage/lib/gui/util/png.py +0 -0
  203. {rummage-4.21.2 → rummage-4.22}/rummage/lib/rumcore/__init__.py +0 -0
  204. {rummage-4.21.2 → rummage-4.22}/rummage/lib/rumcore/text_decode.py +0 -0
  205. {rummage-4.21.2 → rummage-4.22}/rummage/lib/rumcore/util.py +0 -0
  206. {rummage-4.21.2 → rummage-4.22}/tests/__init__.py +0 -0
  207. {rummage-4.21.2 → rummage-4.22}/tests/test_rumcore.py +0 -0
  208. {rummage-4.21.2 → rummage-4.22}/tests/test_text_decode.py +0 -0
  209. {rummage-4.21.2 → rummage-4.22}/tests/test_versions.py +0 -0
  210. {rummage-4.21.2 → rummage-4.22}/tests/util.py +0 -0
  211. {rummage-4.21.2 → rummage-4.22}/tools/__init__.py +0 -0
  212. {rummage-4.21.2 → rummage-4.22}/tools/gen_docs.py +0 -0
  213. {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 - 2024 Isaac Muse <isaacmuse@gmail.com>
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.21.2
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.7
27
- Requires-Dist: backrefs>=5.7
28
- Requires-Dist: bracex>=2.4
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.0
29
+ Requires-Dist: coloraide>=4.7.2
31
30
  Requires-Dist: filelock>=3.16
32
- Requires-Dist: markdown>=3.7
33
- Requires-Dist: pygments>=2.14.1
34
- Requires-Dist: pymdown-extensions>=10.11
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>=2024.9.11; extra == 'extras'
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
- - **FIX**: Use a different wxPython time control on macOS as the previous one would crash on the M series chips.
6
- - **FIX**: Fix an issue with local time to UTC conversion.
7
- - **FIX**: Fix an issue where created time comparisons was actually being done on modified times.
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="true">
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 &copy; 2013 - 2024 <a href="https://github.com/facelessuser" target="_blank" rel="noopener">Isaac Muse</a>
7
+ Copyright &copy; 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.7"
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
- {py38,py39,py310,py311,py312,py313},
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>=2024.9.11
2
+ regex>=2025.7.34
@@ -1,11 +1,11 @@
1
1
  chardet>=5.1.0
2
- backrefs>=5.7
3
- bracex>=2.4
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.7
9
- pymdown-extensions>=10.11
10
- pygments>=2.14.1
11
- coloraide>=4.0
8
+ markdown>=3.8.2
9
+ pymdown-extensions>=10.16.1
10
+ pygments>=2.19.2
11
+ coloraide>=4.7.2
@@ -1,3 +1,3 @@
1
1
  chardet>=5.1.0
2
- backrefs>=5.7
2
+ backrefs>=6.0.1
3
3
  wcmatch>=10.0,<11.0
@@ -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, 21, 2, 'final')
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
- while s != -1:
494
- if s != item:
495
- self.Select(s, False)
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
- self.PopupMenu(menu, pos)
526
- menu.Destroy()
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
- while s != -1:
811
- if s != item:
812
- self.Select(s, False)
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
- self.PopupMenu(menu, pos)
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="422">4.2.2</h2>
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">&quot;&quot;</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">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;%1\&quot;&quot;</span>
135
+ <span class="na">@</span><span class="o">=</span><span class="s">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;</span><span class="na">%1\&quot;&quot;</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">&quot;&quot;</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">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;%1\&quot;&quot;</span>
141
+ <span class="na">@</span><span class="o">=</span><span class="s">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;</span><span class="na">%1\&quot;&quot;</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">&quot;Icon&quot;</span><span class="o">=</span><span class="s">&quot;&lt;python_install_path&gt;\\Lib\\site-packages\\rummage\\lib\\gui\\data\\rummage.ico&quot;</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">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;%1\&quot;&quot;</span>
151
+ <span class="na">@</span><span class="o">=</span><span class="s">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;</span><span class="na">%1\&quot;&quot;</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">&quot;&quot;</span>
155
155
  <span class="na">&quot;Icon&quot;</span><span class="o">=</span><span class="s">&quot;&lt;python_install_path&gt;\\Lib\\site-packages\\rummage\\lib\\gui\\data\\rummage.ico&quot;</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">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;%1\&quot;&quot;</span>
158
+ <span class="na">@</span><span class="o">=</span><span class="s">&quot;&lt;python_install_path&gt;\\Scripts\\rummage.exe --path \&quot;</span><span class="na">%1\&quot;&quot;</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> <span class="nn">os</span>
179
- <span class="kn">import</span> <span class="nn">subprocess</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">&quot;/usr/local/bin/rummage&quot;</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 -&gt; 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> <span class="nc">ReplacePlugin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</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">&quot;&quot;&quot;Rummage replace plugin.&quot;&quot;&quot;</span>
226
226
 
227
- <span class="k">def</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>
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">&quot;&quot;&quot;Initialize.&quot;&quot;&quot;</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> <span class="nf">on_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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">&quot;&quot;&quot;Override this function to add initialization setup.&quot;&quot;&quot;</span>
236
236
 
237
- <span class="k">def</span> <span class="nf">get_flags</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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">&quot;&quot;&quot;Get flags.&quot;&quot;&quot;</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> <span class="nf">get_file_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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">&quot;&quot;&quot;Get file name.&quot;&quot;&quot;</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> <span class="nf">is_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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">&quot;&quot;&quot;Is a binary search.&quot;&quot;&quot;</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">&#39;bin&#39;</span>
251
251
 
252
- <span class="k">def</span> <span class="nf">is_literal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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">&quot;&quot;&quot;Is a literal search.&quot;&quot;&quot;</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">&amp;</span> <span class="n">LITERAL</span>
256
256
 
257
- <span class="k">def</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>
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">&quot;&quot;&quot;Make replacement.&quot;&quot;&quot;</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> <span class="nc">FileInfoRecord</span><span class="p">(</span><span class="n">namedtuple</span><span class="p">(</span><span class="s1">&#39;FileInfoRecord&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">,</span> <span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="s1">&#39;size&#39;</span><span class="p">,</span> <span class="s1">&#39;modified&#39;</span><span class="p">,</span> <span class="s1">&#39;created&#39;</span><span class="p">,</span> <span class="s1">&#39;encoding&#39;</span><span class="p">])):</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">&#39;FileInfoRecord&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">,</span> <span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="s1">&#39;size&#39;</span><span class="p">,</span> <span class="s1">&#39;modified&#39;</span><span class="p">,</span> <span class="s1">&#39;created&#39;</span><span class="p">,</span> <span class="s1">&#39;encoding&#39;</span><span class="p">])):</span>
268
268
  <span class="w"> </span><span class="sd">&quot;&quot;&quot;A record for tracking file info.&quot;&quot;&quot;</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> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">unicode_literals</span>
299
- <span class="kn">from</span> <span class="nn">rummage.lib</span> <span class="kn">import</span> <span class="n">rumcore</span>
300
- <span class="kn">import</span> <span class="nn">os</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> <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>
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">&quot;&quot;&quot;Replace object.&quot;&quot;&quot;</span>
305
305
 
306
- <span class="k">def</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>
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">&quot;&quot;&quot;Replace method.&quot;&quot;&quot;</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> <span class="nf">get_replace</span><span class="p">():</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">&quot;&quot;&quot;Get the replace object.&quot;&quot;&quot;</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.remove(self.trouble_file)
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.remove(f)
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
- self.m_progress_label.SetLabel(self.message % (0, self.total))
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
- self.m_progress_label.SetLabel(self.message % (count, self.total))
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
- self.m_progress_label.SetLabel(self.message % (self.thread.count, self.total))
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: