rummage 4.25__tar.gz → 4.26__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 (217) hide show
  1. {rummage-4.25 → rummage-4.26}/PKG-INFO +1 -1
  2. {rummage-4.25 → rummage-4.26}/docs/src/markdown/about/changelog.md +7 -0
  3. {rummage-4.25 → rummage-4.26}/gui.fbp +10 -7
  4. {rummage-4.25 → rummage-4.26}/pyproject.toml +1 -1
  5. {rummage-4.25 → rummage-4.26}/rummage/lib/__meta__.py +1 -1
  6. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/result_lists.py +13 -4
  7. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/about/changelog.html +7 -0
  8. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/about/contributing.html +2 -2
  9. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/usage.html +2 -2
  10. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/rummage_dialog.py +31 -5
  11. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/gui.py +4 -4
  12. {rummage-4.25 → rummage-4.26}/rummage/lib/rumcore/__init__.py +15 -28
  13. {rummage-4.25 → rummage-4.26}/.coveragerc +0 -0
  14. {rummage-4.25 → rummage-4.26}/.gitignore +0 -0
  15. {rummage-4.25 → rummage-4.26}/LICENSE.md +0 -0
  16. {rummage-4.25 → rummage-4.26}/README.md +0 -0
  17. {rummage-4.25 → rummage-4.26}/docs/src/markdown/.snippets/abbr.md +0 -0
  18. {rummage-4.25 → rummage-4.26}/docs/src/markdown/.snippets/links.md +0 -0
  19. {rummage-4.25 → rummage-4.26}/docs/src/markdown/.snippets/refs.md +0 -0
  20. {rummage-4.25 → rummage-4.26}/docs/src/markdown/about/contributing.md +0 -0
  21. {rummage-4.25 → rummage-4.26}/docs/src/markdown/about/license.md +0 -0
  22. {rummage-4.25 → rummage-4.26}/docs/src/markdown/extras.md +0 -0
  23. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/chain_button.png +0 -0
  24. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/chain_mode.png +0 -0
  25. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/chains.png +0 -0
  26. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/content_tab.png +0 -0
  27. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/file_pattern.png +0 -0
  28. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/files_tab.png +0 -0
  29. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/html_export.png +0 -0
  30. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/limit_search_panel.png +0 -0
  31. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/load_search.png +0 -0
  32. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/logo.svg +0 -0
  33. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/plugin_input.png +0 -0
  34. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/plugin_toggle.png +0 -0
  35. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/preview.png +0 -0
  36. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/regex_buttons.png +0 -0
  37. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/regex_tester.png +0 -0
  38. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/rummage.png +0 -0
  39. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/rummage.svg +0 -0
  40. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/save_search.png +0 -0
  41. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/search_replace_inputs.png +0 -0
  42. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/search_replace_panel.png +0 -0
  43. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/search_tab.png +0 -0
  44. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_backup.png +0 -0
  45. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_editor.png +0 -0
  46. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_encoding.png +0 -0
  47. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_export.png +0 -0
  48. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_general.png +0 -0
  49. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_history.png +0 -0
  50. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_import.png +0 -0
  51. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_notify.png +0 -0
  52. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/settings_search.png +0 -0
  53. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/thunar-basic.png +0 -0
  54. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/thunar-conditions.png +0 -0
  55. {rummage-4.25 → rummage-4.26}/docs/src/markdown/images/thunar-custom.png +0 -0
  56. {rummage-4.25 → rummage-4.26}/docs/src/markdown/index.md +0 -0
  57. {rummage-4.25 → rummage-4.26}/docs/src/markdown/installation.md +0 -0
  58. {rummage-4.25 → rummage-4.26}/docs/src/markdown/preferences.md +0 -0
  59. {rummage-4.25 → rummage-4.26}/docs/src/markdown/search.md +0 -0
  60. {rummage-4.25 → rummage-4.26}/docs/src/markdown/sitemap.md +0 -0
  61. {rummage-4.25 → rummage-4.26}/docs/src/markdown/usage.md +0 -0
  62. {rummage-4.25 → rummage-4.26}/docs/theme/announce.html +0 -0
  63. {rummage-4.25 → rummage-4.26}/docs/theme/assets/pymdownx-extras/extra-95634471d6.css +0 -0
  64. {rummage-4.25 → rummage-4.26}/docs/theme/assets/pymdownx-extras/extra-loader-Ccztcqfq.js +0 -0
  65. {rummage-4.25 → rummage-4.26}/docs/theme/main.html +0 -0
  66. {rummage-4.25 → rummage-4.26}/docs/theme/nav.html +0 -0
  67. {rummage-4.25 → rummage-4.26}/docs/theme/sitemap.html +0 -0
  68. {rummage-4.25 → rummage-4.26}/hatch_build.py +0 -0
  69. {rummage-4.25 → rummage-4.26}/requirements/docs.txt +0 -0
  70. {rummage-4.25 → rummage-4.26}/requirements/extras.txt +0 -0
  71. {rummage-4.25 → rummage-4.26}/requirements/lint.txt +0 -0
  72. {rummage-4.25 → rummage-4.26}/requirements/project.txt +0 -0
  73. {rummage-4.25 → rummage-4.26}/requirements/setup.txt +0 -0
  74. {rummage-4.25 → rummage-4.26}/requirements/test-project.txt +0 -0
  75. {rummage-4.25 → rummage-4.26}/requirements/test.txt +0 -0
  76. {rummage-4.25 → rummage-4.26}/rummage/__init__.py +0 -0
  77. {rummage-4.25 → rummage-4.26}/rummage/__main__.py +0 -0
  78. {rummage-4.25 → rummage-4.26}/rummage/lib/__init__.py +0 -0
  79. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/__init__.py +0 -0
  80. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/__init__.py +0 -0
  81. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/checksum/__init__.py +0 -0
  82. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/checksum/sum_hashes.py +0 -0
  83. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/checksum/tiger.py +0 -0
  84. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/checksum/whirlpool.py +0 -0
  85. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/export_csv.py +0 -0
  86. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/export_html.py +0 -0
  87. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/fileops.py +0 -0
  88. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/sanitize_json.py +0 -0
  89. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/actions/updates.py +0 -0
  90. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/app/__init__.py +0 -0
  91. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/app/custom_app.py +0 -0
  92. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/app/platform_window_focus.py +0 -0
  93. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/app/rummage_app.py +0 -0
  94. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/__init__.py +0 -0
  95. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/autocomplete_combo.py +0 -0
  96. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/collapsible_pane.py +0 -0
  97. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/custom_statusbar.py +0 -0
  98. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/date_picker.py +0 -0
  99. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/dock_icon.py +0 -0
  100. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/dynamic_lists.py +0 -0
  101. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/encoding_list.py +0 -0
  102. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/file_picker.py +0 -0
  103. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/load_search_list.py +0 -0
  104. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/pick_button.py +0 -0
  105. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/search_chain_list.py +0 -0
  106. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/search_error_list.py +0 -0
  107. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/time_picker.py +0 -0
  108. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/controls/webview.py +0 -0
  109. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/__init__.py +0 -0
  110. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/arrow_down.png +0 -0
  111. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/arrow_left.png +0 -0
  112. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/arrow_right.png +0 -0
  113. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/arrow_up.png +0 -0
  114. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/binary.png +0 -0
  115. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/doc.png +0 -0
  116. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/404.html +0 -0
  117. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/about/license.html +0 -0
  118. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/css/theme.css +0 -0
  119. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/extras.html +0 -0
  120. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/chain_button.png +0 -0
  121. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/chain_mode.png +0 -0
  122. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/chains.png +0 -0
  123. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/content_tab.png +0 -0
  124. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/file_pattern.png +0 -0
  125. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/files_tab.png +0 -0
  126. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/html_export.png +0 -0
  127. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/limit_search_panel.png +0 -0
  128. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/load_search.png +0 -0
  129. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/logo.svg +0 -0
  130. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/plugin_input.png +0 -0
  131. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/plugin_toggle.png +0 -0
  132. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/preview.png +0 -0
  133. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/regex_buttons.png +0 -0
  134. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/regex_tester.png +0 -0
  135. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/rummage.png +0 -0
  136. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/rummage.svg +0 -0
  137. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/save_search.png +0 -0
  138. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/search_replace_inputs.png +0 -0
  139. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/search_replace_panel.png +0 -0
  140. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/search_tab.png +0 -0
  141. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_backup.png +0 -0
  142. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_editor.png +0 -0
  143. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_encoding.png +0 -0
  144. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_export.png +0 -0
  145. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_general.png +0 -0
  146. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_history.png +0 -0
  147. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_import.png +0 -0
  148. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_notify.png +0 -0
  149. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/settings_search.png +0 -0
  150. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/thunar-basic.png +0 -0
  151. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/thunar-conditions.png +0 -0
  152. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/images/thunar-custom.png +0 -0
  153. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/index.html +0 -0
  154. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/installation.html +0 -0
  155. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/js/theme.js +0 -0
  156. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/preferences.html +0 -0
  157. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/search.html +0 -0
  158. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/docs/sitemap.html +0 -0
  159. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/error.png +0 -0
  160. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/glass.png +0 -0
  161. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/results.css +0 -0
  162. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage.icns +0 -0
  163. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage.ico +0 -0
  164. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage.png +0 -0
  165. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_1024.png +0 -0
  166. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_128.png +0 -0
  167. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_16.png +0 -0
  168. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_256.png +0 -0
  169. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_32.png +0 -0
  170. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_40.png +0 -0
  171. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_48.png +0 -0
  172. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_512.png +0 -0
  173. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/rummage_mac.png +0 -0
  174. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/data/sorttable.js +0 -0
  175. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/__init__.py +0 -0
  176. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/checksum_dialog.py +0 -0
  177. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/column_dialog.py +0 -0
  178. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/delete_dialog.py +0 -0
  179. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/edit_search_chain_dialog.py +0 -0
  180. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/error_text_dialog.py +0 -0
  181. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/export_settings_dialog.py +0 -0
  182. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/file_ext_dialog.py +0 -0
  183. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/generic_dialogs.py +0 -0
  184. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/html_dialog.py +0 -0
  185. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/import_settings_dialog.py +0 -0
  186. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/load_search_dialog.py +0 -0
  187. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/msg_dialogs.py +0 -0
  188. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/overwrite_dialog.py +0 -0
  189. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/regex_test_dialog.py +0 -0
  190. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/save_search_dialog.py +0 -0
  191. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/search_chain_dialog.py +0 -0
  192. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/search_error_dialog.py +0 -0
  193. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/settings_dialog.py +0 -0
  194. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/dialogs/support_info_dialog.py +0 -0
  195. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/localization/__init__.py +0 -0
  196. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/localization/locale/en_US/LC_MESSAGES/rummage.po +0 -0
  197. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/localization/locale/ru_RU/LC_MESSAGES/rummage.po +0 -0
  198. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/notify/__init__.py +0 -0
  199. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/notify/notify_linux.py +0 -0
  200. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/notify/notify_osx.py +0 -0
  201. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/notify/notify_windows.py +0 -0
  202. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/notify/util.py +0 -0
  203. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/settings/__init__.py +0 -0
  204. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/util/__init__.py +0 -0
  205. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/util/colors.py +0 -0
  206. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/util/images.py +0 -0
  207. {rummage-4.25 → rummage-4.26}/rummage/lib/gui/util/png.py +0 -0
  208. {rummage-4.25 → rummage-4.26}/rummage/lib/rumcore/text_decode.py +0 -0
  209. {rummage-4.25 → rummage-4.26}/rummage/lib/rumcore/util.py +0 -0
  210. {rummage-4.25 → rummage-4.26}/tests/__init__.py +0 -0
  211. {rummage-4.25 → rummage-4.26}/tests/test_rumcore.py +0 -0
  212. {rummage-4.25 → rummage-4.26}/tests/test_text_decode.py +0 -0
  213. {rummage-4.25 → rummage-4.26}/tests/test_versions.py +0 -0
  214. {rummage-4.25 → rummage-4.26}/tests/util.py +0 -0
  215. {rummage-4.25 → rummage-4.26}/tools/__init__.py +0 -0
  216. {rummage-4.25 → rummage-4.26}/tools/gen_docs.py +0 -0
  217. {rummage-4.25 → rummage-4.26}/tools/gui_patch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rummage
3
- Version: 4.25
3
+ Version: 4.26
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>
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.26
4
+
5
+ - **NEW**: Show file sizes in proper, various increments: bytes, KB, MB, and GB.
6
+ - **NEW**: Add control to select file size unit types in limiter panel.
7
+ - **FIX**: Fix issue where directory picker for target folder to search would not start with the current, specified
8
+ directory, even when it is valid.
9
+
3
10
  ## 4.25
4
11
 
5
12
  - **NEW**: Require `wcmatch` 11.0+.
@@ -3106,9 +3106,9 @@
3106
3106
  </object>
3107
3107
  <object class="sizeritem" expanded="false">
3108
3108
  <property name="border">5</property>
3109
- <property name="flag">wxBOTTOM|wxRIGHT|wxTOP|wxALIGN_CENTER_VERTICAL</property>
3109
+ <property name="flag">wxALL</property>
3110
3110
  <property name="proportion">0</property>
3111
- <object class="wxStaticText" expanded="false">
3111
+ <object class="wxChoice" expanded="false">
3112
3112
  <property name="BottomDockable">1</property>
3113
3113
  <property name="LeftDockable">1</property>
3114
3114
  <property name="RightDockable">1</property>
@@ -3122,6 +3122,7 @@
3122
3122
  <property name="caption"></property>
3123
3123
  <property name="caption_visible">1</property>
3124
3124
  <property name="center_pane">0</property>
3125
+ <property name="choices">&quot;bytes&quot; &quot;KB&quot; &quot;MB&quot; &quot;GB&quot; &quot;TB&quot;</property>
3125
3126
  <property name="close_button">1</property>
3126
3127
  <property name="context_help"></property>
3127
3128
  <property name="context_menu">1</property>
@@ -3137,8 +3138,6 @@
3137
3138
  <property name="gripper">0</property>
3138
3139
  <property name="hidden">0</property>
3139
3140
  <property name="id">wxID_ANY</property>
3140
- <property name="label">KB</property>
3141
- <property name="markup">0</property>
3142
3141
  <property name="max_size"></property>
3143
3142
  <property name="maximize_button">0</property>
3144
3143
  <property name="maximum_size"></property>
@@ -3146,7 +3145,7 @@
3146
3145
  <property name="minimize_button">0</property>
3147
3146
  <property name="minimum_size"></property>
3148
3147
  <property name="moveable">1</property>
3149
- <property name="name">m_size_type_label</property>
3148
+ <property name="name">m_size_type_choice</property>
3150
3149
  <property name="pane_border">1</property>
3151
3150
  <property name="pane_position"></property>
3152
3151
  <property name="pane_size"></property>
@@ -3154,16 +3153,20 @@
3154
3153
  <property name="pin_button">1</property>
3155
3154
  <property name="pos"></property>
3156
3155
  <property name="resize">Resizable</property>
3156
+ <property name="selection">1</property>
3157
3157
  <property name="show">1</property>
3158
3158
  <property name="size"></property>
3159
3159
  <property name="style"></property>
3160
- <property name="subclass"></property>
3160
+ <property name="subclass">; ; forward_declare</property>
3161
3161
  <property name="toolbar_pane">0</property>
3162
3162
  <property name="tooltip"></property>
3163
+ <property name="validator_data_type"></property>
3164
+ <property name="validator_style">wxFILTER_NONE</property>
3165
+ <property name="validator_type">wxDefaultValidator</property>
3166
+ <property name="validator_variable"></property>
3163
3167
  <property name="window_extra_style"></property>
3164
3168
  <property name="window_name"></property>
3165
3169
  <property name="window_style"></property>
3166
- <property name="wrap">-1</property>
3167
3170
  </object>
3168
3171
  </object>
3169
3172
  </object>
@@ -181,6 +181,6 @@ deps =
181
181
  -rrequirements/docs.txt
182
182
  commands =
183
183
  {envbindir}/zensical build -f zensical.yml --clean
184
- pyspelling -j 0
184
+ pyspelling -j 8
185
185
  {envpython} {toxinidir}/tools/gen_docs.py --verbose --test
186
186
  """
@@ -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, 25, 0, 'final')
192
+ __version_info__ = Version(4, 26, 0, 'final')
193
193
  __version__ = __version_info__._get_canonical()
194
194
  __app__ = "Rummage"
195
195
  __status__ = __version_info__[3]
@@ -20,7 +20,6 @@ IN THE SOFTWARE.
20
20
  """
21
21
  import time
22
22
  import wx
23
- import decimal
24
23
  import os
25
24
  import functools
26
25
  from .dynamic_lists import DynamicList, USE_SAMPLE_SIZE
@@ -324,7 +323,7 @@ class ResultFileList(CommonOperationsMixin, DynamicList):
324
323
  os.path.basename(obj.name),
325
324
  0,
326
325
  obj.ext,
327
- decimal.Decimal(obj.size) / decimal.Decimal(1024),
326
+ obj.size,
328
327
  os.path.dirname(obj.name),
329
328
  '',
330
329
  obj.modified,
@@ -342,7 +341,7 @@ class ResultFileList(CommonOperationsMixin, DynamicList):
342
341
  os.path.basename(obj.info.name),
343
342
  1,
344
343
  obj.info.ext,
345
- decimal.Decimal(obj.info.size) / decimal.Decimal(1024),
344
+ obj.info.size,
346
345
  os.path.dirname(obj.info.name),
347
346
  obj.info.encoding,
348
347
  obj.info.modified,
@@ -374,7 +373,17 @@ class ResultFileList(CommonOperationsMixin, DynamicList):
374
373
  if not absolute:
375
374
  item = self.itemIndexMap[item]
376
375
  if real == FILE_SIZE:
377
- return '%.2fKB' % round(self.itemDataMap[item][FILE_SIZE], 2)
376
+ s = self.itemDataMap[item][FILE_SIZE]
377
+ if s < 1e3:
378
+ return f"{s:d} bytes"
379
+ elif s < 1e6:
380
+ return f'{s / 1e3:.2f} KB'
381
+ elif s < 1e9:
382
+ return f'{s / 1e6:.2f} MB'
383
+ elif s < 1e12:
384
+ return f'{s / 1e9:.2f} GB'
385
+ else:
386
+ return f'{s / 1e12:.2f} TB'
378
387
  elif real in (FILE_MOD, FILE_CRE):
379
388
  if self.international:
380
389
  return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.itemDataMap[item][real]))
@@ -25,6 +25,13 @@
25
25
 
26
26
  <!-- Table of Content (Don't show for static sites) -->
27
27
  <h1 id="changelog">Changelog</h1>
28
+ <h2 id="426">4.26</h2>
29
+ <ul>
30
+ <li><strong>NEW</strong>: Show file sizes in proper, various increments: bytes, KB, MB, and GB.</li>
31
+ <li><strong>NEW</strong>: Add control to select file size unit types in limiter panel.</li>
32
+ <li><strong>FIX</strong>: Fix issue where directory picker for target folder to search would not start with the current, specified
33
+ directory, even when it is valid.</li>
34
+ </ul>
28
35
  <h2 id="425">4.25</h2>
29
36
  <ul>
30
37
  <li><strong>NEW</strong>: Require <code>wcmatch</code> 11.0+.</li>
@@ -31,7 +31,7 @@
31
31
  <div class="__toc_wrapper"><span class="__toc_icon"></span>
32
32
  <div class="__toc_content">
33
33
  <ul class="__toc_list">
34
- <li class="__toc_level_2"><a href="#contributing--support">Contributing &amp; Support</a></li>
34
+ <li class="__toc_level_2"><a href="#contributing-support">Contributing &amp; Support</a></li>
35
35
  <ul class="__toc_list_2">
36
36
 
37
37
  <li class="__toc_level_3"><a href="#overview">Overview</a></li>
@@ -70,7 +70,7 @@
70
70
  </ul>
71
71
  </div>
72
72
  </div>
73
- <h1 id="contributing--support">Contributing &amp; Support</h1>
73
+ <h1 id="contributing-support">Contributing &amp; Support</h1>
74
74
  <h2 id="overview">Overview</h2>
75
75
  <p>Contribution from the community is encouraged and can be done in a variety of ways:</p>
76
76
  <ul>
@@ -42,7 +42,7 @@
42
42
  <ul class="__toc_list_3">
43
43
 
44
44
  </ul>
45
- <li class="__toc_level_3"><a href="#searching--replacing">Searching &amp; Replacing</a></li>
45
+ <li class="__toc_level_3"><a href="#searching-replacing">Searching &amp; Replacing</a></li>
46
46
  <ul class="__toc_list_3">
47
47
 
48
48
  <li class="__toc_level_4"><a href="#configuring-text-search">Configuring Text Search</a></li>
@@ -114,7 +114,7 @@ major and minor Python version to the end:</p>
114
114
  <a href="./installation.html#running-in-anaconda">Running in Anaconda</a>).</p>
115
115
  <div class="highlight"><pre><span></span><code>pythonw<span class="w"> </span>-m<span class="w"> </span>rummage
116
116
  </code></pre></div>
117
- <h2 id="searching--replacing">Searching &amp; Replacing</h2>
117
+ <h2 id="searching-replacing">Searching &amp; Replacing</h2>
118
118
  <p><img alt="Search Tab" src="images/search_tab.png" /></p>
119
119
  <p>Search and replaces are configured in the <strong>Search</strong> tab. The search tab can essentially be broken up into two sections:
120
120
  text search configuration and file search configuration.</p>
@@ -68,7 +68,6 @@ from ... import __meta__
68
68
  from ... import rumcore
69
69
  from .. import util
70
70
  from ..util.colors import Color
71
- import decimal
72
71
  if rumcore.REGEX_SUPPORT:
73
72
  from backrefs import bregex
74
73
  else:
@@ -818,6 +817,9 @@ class RummageFrame(gui.RummageFrame):
818
817
  )
819
818
  )
820
819
  self.m_size_text.SetValue(Settings.get_search_setting("size_limit_string", "1000"))
820
+ self.m_size_type_choice.SetStringSelection(
821
+ Settings.get_search_setting("size_compare_type", "KB")
822
+ )
821
823
 
822
824
  self.m_case_checkbox.SetValue(not Settings.get_search_setting("ignore_case_toggle", False))
823
825
  self.m_dotmatch_checkbox.SetValue(Settings.get_search_setting("dotall_toggle", False))
@@ -1418,8 +1420,17 @@ class RummageFrame(gui.RummageFrame):
1418
1420
 
1419
1421
  cmp_size = self.m_logic_choice.GetSelection()
1420
1422
  if cmp_size:
1421
- size = decimal.Decimal(self.m_size_text.GetValue())
1422
- args.size_compare = (LIMIT_COMPARE[cmp_size], round(size * decimal.Decimal(1024)))
1423
+ size = int(self.m_size_text.GetValue())
1424
+ size_type = self.m_size_type_choice.GetStringSelection()
1425
+ if size_type == "KB":
1426
+ size *= 1e3
1427
+ elif size_type == "MB":
1428
+ size *= 1e6
1429
+ elif size_type == "GB":
1430
+ size *= 1e9
1431
+ elif size_type == "TB":
1432
+ size *= 1e12
1433
+ args.size_compare = (LIMIT_COMPARE[cmp_size], size)
1423
1434
  else:
1424
1435
  args.size_compare = None
1425
1436
  cmp_modified = self.m_modified_choice.GetSelection()
@@ -1573,7 +1584,20 @@ class RummageFrame(gui.RummageFrame):
1573
1584
  strings.append(("force_encode", self.m_force_encode_choice.GetStringSelection()))
1574
1585
 
1575
1586
  if eng_size != "any":
1576
- strings += [("size_limit_string", self.m_size_text.GetValue())]
1587
+ size_limit = int(self.m_size_text.GetValue())
1588
+ size_type = self.m_size_type_choice.GetStringSelection()
1589
+ if size_type == 'KB':
1590
+ size_limit *= 1e3
1591
+ elif size_type == "MB":
1592
+ size_limit *= 1e6
1593
+ elif size_type == "GB":
1594
+ size_limit *= 1e9
1595
+ elif size_type == "TB":
1596
+ size_limit *= 1e12
1597
+ strings += [
1598
+ ("size_limit_string", str(size_limit)),
1599
+ ("size_compare_type", size_type)
1600
+ ]
1577
1601
  if eng_mod != "on any":
1578
1602
  strings += [
1579
1603
  ("modified_date_string", self.m_modified_date_picker.GetValue().Format("%m/%d/%Y")),
@@ -2159,7 +2183,9 @@ class RummageFrame(gui.RummageFrame):
2159
2183
  def on_searchin_changed(self):
2160
2184
  """Callback for when a directory changes via the `m_searchin_text` control."""
2161
2185
 
2162
- self.SetTitle(self.m_searchin_text.GetValue())
2186
+ target = self.m_searchin_text.GetValue()
2187
+ self.SetTitle(target)
2188
+ self.m_searchin_dir_picker.target = target
2163
2189
 
2164
2190
  def on_save_search(self, event):
2165
2191
  """Open a dialog to save a search for later use."""
@@ -259,10 +259,10 @@ class RummageFrame ( wx.Frame ):
259
259
  self.m_size_text = wx.TextCtrl( self.m_limit_panel, wx.ID_ANY, u"1000", wx.DefaultPosition, wx.Size( -1,-1 ), 0 )
260
260
  fgSizer37.Add( self.m_size_text, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
261
261
 
262
- self.m_size_type_label = wx.StaticText( self.m_limit_panel, wx.ID_ANY, u"KB", wx.DefaultPosition, wx.DefaultSize, 0 )
263
- self.m_size_type_label.Wrap( -1 )
264
-
265
- fgSizer37.Add( self.m_size_type_label, 0, wx.BOTTOM|wx.RIGHT|wx.TOP|wx.ALIGN_CENTER_VERTICAL, 5 )
262
+ m_size_type_choiceChoices = [ u"bytes", u"KB", u"MB", u"GB", u"TB" ]
263
+ self.m_size_type_choice = wx.Choice( self.m_limit_panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_size_type_choiceChoices, 0 )
264
+ self.m_size_type_choice.SetSelection( 1 )
265
+ fgSizer37.Add( self.m_size_type_choice, 0, wx.ALL, 5 )
266
266
 
267
267
 
268
268
  gbSizer3.Add( fgSizer37, wx.GBPosition( 0, 2 ), wx.GBSpan( 1, 3 ), wx.EXPAND, 5 )
@@ -431,37 +431,27 @@ class _RummageFileContent:
431
431
  enc = 'utf-32'
432
432
  return enc
433
433
 
434
- def _read_bin(self):
435
- """Setup binary file reading with `mmap`."""
434
+ def _read_file(self):
435
+ """Read the file in."""
436
+
437
+ if self.encoding.encode != "bin":
438
+ try:
439
+ self.file_obj = open(self.name, 'r', encoding=self._get_encoding(), errors='strict')
440
+ return self.file_obj.read()
441
+ except Exception:
442
+ self.encoding = text_decode.Encoding("bin", None)
443
+
444
+ if self.file_obj is not None:
445
+ self.file_obj.close()
446
+
436
447
  try:
437
448
  self.file_obj = open(self.name, "rb")
438
449
  if self.size != 0:
439
450
  self.file_map = mmap.mmap(self.file_obj.fileno(), 0, access=mmap.ACCESS_READ)
451
+ return self.file_obj.read() if self.file_map is None else self.file_map
440
452
  except Exception as e:
441
- # _read_bin has no other fallbacks, so we issue this if it fails.
442
453
  raise RummageException("Could not access or read file.") from e
443
454
 
444
- def _read_file(self):
445
- """Read the file in."""
446
-
447
- try:
448
- if self.encoding.encode == "bin":
449
- self._read_bin()
450
- else:
451
- enc = self._get_encoding()
452
- self.file_obj = open(self.name, 'r', encoding=enc, errors='strict')
453
- return self.file_obj.read() if self.file_map is None else self.file_map
454
- except RummageException:
455
- # Bubble up `RummageExceptions`
456
- raise
457
- except Exception:
458
- if self.encoding.encode != "bin":
459
- if self.file_obj is not None:
460
- self.file_obj.close()
461
- self.encoding = text_decode.Encoding("bin", None)
462
- self._read_bin()
463
- return self.file_map
464
-
465
455
 
466
456
  class _FileSearch:
467
457
  """Search for files."""
@@ -1083,10 +1073,7 @@ class _FileSearch:
1083
1073
  if not file_record_sent:
1084
1074
  yield FileRecord(file_info, None, None)
1085
1075
  except Exception:
1086
- yield FileRecord(
1087
- file_info, None,
1088
- get_exception()
1089
- )
1076
+ yield FileRecord(file_info, None, get_exception())
1090
1077
 
1091
1078
  def run(self):
1092
1079
  """Start the file search."""
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes