ibridgesgui 2.1.2__tar.gz → 2.2.0__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 (182) hide show
  1. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/linter.yml +5 -3
  2. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/publish.yml +1 -1
  3. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/pypi_release.yml +3 -3
  4. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/tests.yml +17 -13
  5. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.gitignore +4 -0
  6. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/PKG-INFO +5 -4
  7. ibridgesgui-2.2.0/_quarto.yml +41 -0
  8. ibridgesgui-2.2.0/_styles/callouts.css +39 -0
  9. ibridgesgui-2.2.0/_styles/code.css +6 -0
  10. ibridgesgui-2.2.0/_styles/hyperlinks.css +24 -0
  11. ibridgesgui-2.2.0/_styles/ibridges.css +127 -0
  12. ibridgesgui-2.2.0/_styles/navbar.css +13 -0
  13. ibridgesgui-2.2.0/_styles/search_icon.css +13 -0
  14. ibridgesgui-2.2.0/_styles/toc.css +44 -0
  15. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/coverage.svg +1 -1
  16. ibridgesgui-2.2.0/docs/developers.qmd +127 -0
  17. ibridgesgui-2.2.0/docs/faq.qmd +64 -0
  18. ibridgesgui-2.2.0/docs/getting-started.qmd +176 -0
  19. ibridgesgui-2.2.0/docs/info.qmd +92 -0
  20. ibridgesgui-2.2.0/docs/screenshots/manage_tickets.png +0 -0
  21. ibridgesgui-2.2.0/docs/screenshots/supply_ticket.png +0 -0
  22. ibridgesgui-2.2.0/docs/userdoc.qmd +255 -0
  23. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/_version.py +3 -3
  24. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/browser_controller.py +1 -3
  25. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/irods_browser_service.py +11 -4
  26. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/gui_utils.py +7 -1
  27. ibridgesgui-2.2.0/ibridgesgui/icons/logo.png +0 -0
  28. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/info.py +13 -0
  29. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/login.py +6 -2
  30. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/main_window.py +35 -8
  31. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/session_manager.py +1 -1
  32. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/tab_manager.py +0 -1
  33. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/__init__.py +5 -1
  34. ibridgesgui-2.2.0/ibridgesgui/popup_widgets/manage_tickets.py +166 -0
  35. ibridgesgui-2.2.0/ibridgesgui/popup_widgets/supply_ticket.py +60 -0
  36. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/sync_controller.py +1 -1
  37. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/threads.py +6 -0
  38. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/MainMenu.py +41 -9
  39. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/MainMenu.ui +64 -4
  40. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/rescTree.ui +3 -3
  41. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabInfo.py +126 -114
  42. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabInfo.ui +153 -139
  43. ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketEditor.py +211 -0
  44. ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketEditor.ui +233 -0
  45. ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketSupply.py +124 -0
  46. ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketSupply.ui +159 -0
  47. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/PKG-INFO +5 -4
  48. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/SOURCES.txt +18 -0
  49. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/requires.txt +2 -2
  50. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/scm_file_list.json +134 -116
  51. ibridgesgui-2.2.0/ibridgesgui.egg-info/scm_version.json +8 -0
  52. ibridgesgui-2.2.0/index.qmd +54 -0
  53. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/pyproject.toml +4 -3
  54. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/gui/test_info_tab.py +2 -0
  55. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_main_window.py +2 -2
  56. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_session_manager.py +2 -2
  57. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/conftest.py +16 -21
  58. ibridgesgui-2.2.0/tests/popup/test_manage_tickets.py +409 -0
  59. ibridgesgui-2.2.0/tests/popup/test_supply_ticket.py +180 -0
  60. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/test_transfer_thread.py +1 -8
  61. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/unit/test_gui_utils.py +14 -0
  62. ibridgesgui-2.1.2/_quarto.yml +0 -25
  63. ibridgesgui-2.1.2/docs/developers.qmd +0 -12
  64. ibridgesgui-2.1.2/docs/faq.qmd +0 -36
  65. ibridgesgui-2.1.2/docs/getting-started.qmd +0 -101
  66. ibridgesgui-2.1.2/docs/info.qmd +0 -68
  67. ibridgesgui-2.1.2/docs/userdoc.qmd +0 -148
  68. ibridgesgui-2.1.2/ibridgesgui.egg-info/scm_version.json +0 -8
  69. ibridgesgui-2.1.2/index.qmd +0 -14
  70. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.flake8 +0 -0
  71. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  72. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  73. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/dependabot.yml +0 -0
  74. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/nuitka_release.yml +0 -0
  75. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/LICENSE +0 -0
  76. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/README.md +0 -0
  77. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/build_tools/build_script.py +0 -0
  78. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/build_tools/ui_to_py.py +0 -0
  79. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/add_check_config.png +0 -0
  80. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/add_new_config.png +0 -0
  81. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/browser.png +0 -0
  82. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/login.png +0 -0
  83. {ibridgesgui-2.1.2/ibridgesgui/icons → ibridgesgui-2.2.0/docs/screenshots}/logo.png +0 -0
  84. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/metadata.png +0 -0
  85. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/permissions.png +0 -0
  86. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/replicas.png +0 -0
  87. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/search.png +0 -0
  88. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/start_ibridges.png +0 -0
  89. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/sync.png +0 -0
  90. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/__init__.py +0 -0
  91. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/__main__.py +0 -0
  92. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/__init__.py +0 -0
  93. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/browser.py +0 -0
  94. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/browser_model.py +0 -0
  95. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/config.py +0 -0
  96. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/arrow-left.png +0 -0
  97. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/arrow-right.png +0 -0
  98. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/arrow-up.png +0 -0
  99. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/christmas-logo.png +0 -0
  100. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/home.png +0 -0
  101. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/iBridges.ico +0 -0
  102. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/loading_circle.gif +0 -0
  103. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/nosync.png +0 -0
  104. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/refresh.png +0 -0
  105. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/syncing.png +0 -0
  106. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/irods_tree_model.py +0 -0
  107. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/logviewer.py +0 -0
  108. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/__init__.py +0 -0
  109. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/config_manager.py +0 -0
  110. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/plugin_manager.py +0 -0
  111. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/md_schemas/ibridges_metadata_schema.json +0 -0
  112. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/base.py +0 -0
  113. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/check_config.py +0 -0
  114. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/create_collection.py +0 -0
  115. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/create_directory.py +0 -0
  116. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/download_data.py +0 -0
  117. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/rename_item.py +0 -0
  118. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/resc_tree.py +0 -0
  119. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/upload_data.py +0 -0
  120. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/__init__.py +0 -0
  121. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/search.py +0 -0
  122. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/search_controller.py +0 -0
  123. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/search_model.py +0 -0
  124. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/__init__.py +0 -0
  125. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/sync.py +0 -0
  126. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/sync_model.py +0 -0
  127. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/__init__.py +0 -0
  128. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/configCheck.py +0 -0
  129. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/configCheck.ui +0 -0
  130. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/createCollection.py +0 -0
  131. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/createCollection.ui +0 -0
  132. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/downloadData.py +0 -0
  133. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/downloadData.ui +0 -0
  134. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/irodsLogin.py +0 -0
  135. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/irodsLogin.ui +0 -0
  136. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/renameItem.py +0 -0
  137. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/renameItem.ui +0 -0
  138. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/rescTree.py +0 -0
  139. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabBrowser.py +0 -0
  140. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabBrowser.ui +0 -0
  141. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabLogging.py +0 -0
  142. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabLogging.ui +0 -0
  143. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSearch.py +0 -0
  144. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSearch.ui +0 -0
  145. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSync.py +0 -0
  146. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSync.ui +0 -0
  147. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/transferData.py +0 -0
  148. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/transferData.ui +0 -0
  149. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/uploadData.py +0 -0
  150. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/uploadData.ui +0 -0
  151. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/welcome.py +0 -0
  152. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/welcome.ui +0 -0
  153. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/welcome.py +0 -0
  154. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/dependency_links.txt +0 -0
  155. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/top_level.txt +0 -0
  156. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/setup.cfg +0 -0
  157. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/conftest.py +0 -0
  158. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/test_browser_controller.py +0 -0
  159. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/test_browser_model.py +0 -0
  160. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/test_irods_browser_service.py +0 -0
  161. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/conftest.py +0 -0
  162. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/gui/test_login.py +0 -0
  163. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/gui/test_main.py +0 -0
  164. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/conftest.py +0 -0
  165. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_config_manager.py +0 -0
  166. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_tab_manager.py +0 -0
  167. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_check_config.py +0 -0
  168. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_download_data.py +0 -0
  169. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_simple_dialogs.py +0 -0
  170. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_transfer_dialog_base.py +0 -0
  171. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_upload_data.py +0 -0
  172. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/search/conftest.py +0 -0
  173. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/search/test_search_controller.py +0 -0
  174. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/search/test_search_model.py +0 -0
  175. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/sync/conftest.py +0 -0
  176. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/sync/test_sync_controller.py +0 -0
  177. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/sync/test_sync_model.py +0 -0
  178. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/conftest.py +0 -0
  179. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/test_search_thread.py +0 -0
  180. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/test_sync_thread.py +0 -0
  181. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/unit/test_config.py +0 -0
  182. {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/unit/test_irods_tree_model.py +0 -0
@@ -12,6 +12,7 @@ on:
12
12
  - 'docs/**'
13
13
  - 'README.md'
14
14
  - '_quarto.yml'
15
+ - '_styles/**'
15
16
  - 'index.qmd'
16
17
 
17
18
  pull_request:
@@ -19,6 +20,7 @@ on:
19
20
  - 'docs/**'
20
21
  - 'README.md'
21
22
  - '_quarto.yml'
23
+ - '_styles/**'
22
24
  - 'index.qmd'
23
25
 
24
26
  jobs:
@@ -27,7 +29,7 @@ jobs:
27
29
  fail-fast: false
28
30
  matrix:
29
31
  os: [ubuntu-latest]
30
- python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
32
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
31
33
  include:
32
34
  - os: windows-latest
33
35
  python-version: "3.12"
@@ -36,10 +38,10 @@ jobs:
36
38
  runs-on: ${{ matrix.os }}
37
39
 
38
40
  steps:
39
- - uses: actions/checkout@v4
41
+ - uses: actions/checkout@v5
40
42
 
41
43
  - name: Set up Python ${{ matrix.python-version }}
42
- uses: actions/setup-python@v4
44
+ uses: actions/setup-python@v5
43
45
  with:
44
46
  python-version: ${{ matrix.python-version }}
45
47
 
@@ -12,7 +12,7 @@ jobs:
12
12
  contents: write
13
13
  steps:
14
14
  - name: Check out repository
15
- uses: actions/checkout@v4
15
+ uses: actions/checkout@v5
16
16
 
17
17
  - name: Set up Quarto
18
18
  uses: quarto-dev/quarto-actions/setup@v2
@@ -24,9 +24,9 @@ jobs:
24
24
  runs-on: ubuntu-latest
25
25
 
26
26
  steps:
27
- - uses: actions/checkout@v4
27
+ - uses: actions/checkout@v5
28
28
  - name: Set up Python
29
- uses: actions/setup-python@v4
29
+ uses: actions/setup-python@v5
30
30
  with:
31
31
  python-version: '3.x'
32
32
  - name: Install dependencies
@@ -36,7 +36,7 @@ jobs:
36
36
  - name: Build package
37
37
  run: python -m build
38
38
  - name: Publish package
39
- uses: pypa/gh-action-pypi-publish@v1.12.4
39
+ uses: pypa/gh-action-pypi-publish@release/v1
40
40
  with:
41
41
  user: __token__
42
42
  password: ${{ secrets.PYPI_API_TOKEN }}
@@ -3,7 +3,19 @@ name: Tests
3
3
  on:
4
4
  push:
5
5
  branches: [main, develop]
6
+ paths-ignore:
7
+ - 'docs/**'
8
+ - 'README.md'
9
+ - '_quarto.yml'
10
+ - '_styles/**'
11
+ - 'index.qmd'
6
12
  pull_request:
13
+ paths-ignore:
14
+ - 'docs/**'
15
+ - 'README.md'
16
+ - '_quarto.yml'
17
+ - '_styles/**'
18
+ - 'index.qmd'
7
19
 
8
20
  permissions:
9
21
  contents: write
@@ -14,23 +26,21 @@ jobs:
14
26
  fail-fast: true
15
27
  matrix:
16
28
  os: [ubuntu-latest]
17
- python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
29
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
18
30
  include:
19
31
  - os: macos-latest
20
32
  python-version: "3.13"
21
33
  runs-on: ${{ matrix.os }}
22
34
  steps:
23
35
  - name: Checkout
24
- uses: actions/checkout@v4
36
+ uses: actions/checkout@v6
25
37
 
26
38
  - name: Set up Python
27
- uses: actions/setup-python@v5
39
+ uses: actions/setup-python@v6
28
40
  with:
29
41
  python-version: ${{ matrix.python-version }}
30
42
 
31
- # -----------------------------
32
43
  # Linux-only Qt dependencies
33
- # -----------------------------
34
44
  - name: Install Qt system dependencies (Linux)
35
45
  if: runner.os == 'Linux'
36
46
  run: |
@@ -48,18 +58,14 @@ jobs:
48
58
  libxcb-xfixes0 \
49
59
  xvfb
50
60
 
51
- # -----------------------------
52
- # Install Python dependencies
53
- # -----------------------------
61
+
54
62
  - name: Install dependencies
55
63
  run: |
56
64
  python -m pip install --upgrade pip
57
65
  python -m pip install .[test]
58
66
  python -m pip install pytest pytest-cov
59
67
 
60
- # -----------------------------
61
68
  # Set Qt to offscreen mode
62
- # -----------------------------
63
69
  - name: Configure Qt for headless mode
64
70
  run: |
65
71
  echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV
@@ -69,9 +75,7 @@ jobs:
69
75
  echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV
70
76
  echo "QT_MAC_WANTS_LAYER=1" >> $GITHUB_ENV
71
77
 
72
- # -----------------------------
73
- # Run tests
74
- # -----------------------------
78
+
75
79
  - name: Run tests and coverage
76
80
  run: |
77
81
  python -m pytest --cov=ibridgesgui --cov-report=xml --cov-report=term-missing --cov-fail-under=70 tests
@@ -141,3 +141,7 @@ dmypy.json
141
141
  .pyre/
142
142
 
143
143
  /.quarto/
144
+ _html/
145
+ _site/
146
+
147
+ **/*.quarto_ipynb
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ibridgesgui
3
- Version: 2.1.2
3
+ Version: 2.2.0
4
4
  Summary: Graphical user interface for accessing data and metadata on iRODS servers.
5
5
  Author-email: Christine Staiger <c.staiger@uu.nl>
6
6
  License: GNU LESSER GENERAL PUBLIC LICENSE
@@ -512,17 +512,18 @@ Project-URL: GitHub, https://github.com/chStaiger/iBridges-Gui
512
512
  Project-URL: documentation, https://github.com/chStaiger/iBridges-Gui
513
513
  Keywords: irods,data management,storage
514
514
  Classifier: Programming Language :: Python :: 3
515
- Classifier: Programming Language :: Python :: 3.9
516
515
  Classifier: Programming Language :: Python :: 3.10
517
516
  Classifier: Programming Language :: Python :: 3.11
518
517
  Classifier: Programming Language :: Python :: 3.12
518
+ Classifier: Programming Language :: Python :: 3.13
519
+ Classifier: Programming Language :: Python :: 3.14
519
520
  Classifier: Development Status :: 3 - Alpha
520
521
  Requires-Python: >=3.9
521
522
  Description-Content-Type: text/markdown
522
523
  License-File: LICENSE
523
524
  Requires-Dist: PySide6>=6.8.1
524
- Requires-Dist: ibridges<2.2,>=2.1.0
525
- Requires-Dist: setproctitle==1.3.7
525
+ Requires-Dist: ibridges<2.3,>=2.2.0
526
+ Requires-Dist: setproctitle==1.3.8
526
527
  Requires-Dist: importlib-resources; python_version <= "3.10"
527
528
  Requires-Dist: jsonschema
528
529
  Provides-Extra: test
@@ -0,0 +1,41 @@
1
+ project:
2
+ type: website
3
+ output-dir: ./_html
4
+
5
+ website:
6
+ title: "iBridges GUI"
7
+ navbar:
8
+ title: false
9
+ logo: docs/screenshots/logo.png
10
+ left:
11
+ - href: index.qmd
12
+ text: Home
13
+ - href: docs/info.qmd
14
+ text: What is iBridges-Gui?
15
+ - href: docs/getting-started.qmd
16
+ text: Getting started
17
+ - href: docs/userdoc.qmd
18
+ text: Documentation
19
+ - href: docs/developers.qmd
20
+ text: Contributing to iBridges
21
+ - href: docs/faq.qmd
22
+ text: FAQ
23
+ tools:
24
+ - icon: github
25
+ menu:
26
+ - text: Source Code
27
+ url: https://github.com/iBridges-for-iRODS/iBridges-GUI
28
+ - text: Report and Issue
29
+ url: https://github.com/iBridges-for-iRODS/iBridges-GUI/issues
30
+ format:
31
+ html:
32
+ theme: flatly
33
+ css:
34
+ - _styles/ibridges.css
35
+ - _styles/hyperlinks.css
36
+ - _styles/toc.css
37
+ - _styles/callouts.css
38
+ - _styles/code.css
39
+ - _styles/navbar.css
40
+ - _styles/search_icon.css
41
+ toc: true
@@ -0,0 +1,39 @@
1
+ /* Base header override */
2
+ .callout-header {
3
+ background-color: #a8e3d7 !important;
4
+ }
5
+
6
+ /* Note callout */
7
+ .callout.callout-note {
8
+ border-left-color: #548641 !important;
9
+ }
10
+
11
+ /* Warning callout */
12
+ .callout.callout-warning {
13
+ border-left-color: #E67E22 !important;
14
+ }
15
+
16
+ /* ----------------------------------------------------------
17
+ TIP CALLOUT — iBridges style
18
+ ---------------------------------------------------------- */
19
+
20
+ /* Main accent colour */
21
+ .callout.callout-tip {
22
+ border-left-color: #15a589 !important;
23
+ }
24
+
25
+ /* Lighter background (15a589 → lighten by ~35%) */
26
+ .callout.callout-tip .callout-header {
27
+ background-color: #c8efe6 !important; /* soft mint */
28
+ color: #0f7f68 !important; /* darker accent for text */
29
+ }
30
+
31
+ /* Icon in main accent colour */
32
+ .callout.callout-tip .callout-icon svg {
33
+ fill: #15a589 !important;
34
+ }
35
+
36
+ /* Body text in accent colour */
37
+ .callout.callout-tip .callout-body {
38
+ color: #0f7f68 !important;
39
+ }
@@ -0,0 +1,6 @@
1
+ /* Code text color override */
2
+ code,
3
+ pre code,
4
+ .reveal pre code {
5
+ color: #15a589 !important;
6
+ }
@@ -0,0 +1,24 @@
1
+ /* Default link color (brand green) */
2
+ #quarto-content a {
3
+ color: #58585a !important;
4
+ font-weight: normal;
5
+ text-decoration: none;
6
+ }
7
+
8
+ /* Hover: bold + darker green */
9
+ #quarto-content a:hover {
10
+ color: #58585a !important; /* darker shade derived from #528641 */
11
+ font-weight: bold;
12
+ text-decoration: underline; /* remove if you prefer no underline */
13
+ }
14
+
15
+ /* Active (clicked) */
16
+ #quarto-content a:active {
17
+ color: #58585a !important;
18
+ font-weight: bold;
19
+ }
20
+
21
+ /* Visited links (keep consistent) */
22
+ #quarto-content a:visited {
23
+ color: #58585a !important;
24
+ }
@@ -0,0 +1,127 @@
1
+ /*-- scss:defaults --*/
2
+
3
+ /* Fonts */
4
+ @import url('https://fonts.googleapis.com/css?family=Merriweather:wght@300&family=Open+Sans&display=swap');
5
+ @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@300;800&display=swap');
6
+
7
+ $font-family-sans-serif: 'Nunito', Tahoma, sans-serif !default;
8
+
9
+ /* Headings */
10
+ $presentation-heading-font: 'Merriweather', Tahoma, sans-serif !default;
11
+ $presentation-heading-color: #000000 !default;
12
+ $h1-font-size: 3.0em !default;
13
+ $h2-font-size: 2.7em !default;
14
+ $h3-font-size: 2.15em !default;
15
+
16
+ /*-- scss:rules --*/
17
+
18
+ /* Title slide h1 */
19
+ section.slide h1 {
20
+ margin-left: 5vw;
21
+ }
22
+
23
+ /* Section headings */
24
+ section.slide h2 {
25
+ color: black !important;
26
+ background-color: #d3d3d3 !important;
27
+ width: 100%;
28
+ position: relative;
29
+ left: -30vw;
30
+
31
+ padding-left: 20vw;
32
+ padding-right: 20vw;
33
+ padding-top: 5px;
34
+ padding-bottom: 10px;
35
+ margin-left: 5vw;
36
+
37
+ display: flex;
38
+ justify-content: space-between;
39
+ align-items: center;
40
+ }
41
+
42
+ /* Theme section blocks */
43
+ .theme-section {
44
+ text-align: left;
45
+ margin-top: 1.2em;
46
+ margin-left: 5vw;
47
+ }
48
+
49
+ /* Code blocks */
50
+ .reveal pre code {
51
+ background-color: #FFFFFF;
52
+ font-size: 0.8em;
53
+ padding: 0.4em;
54
+ margin: 0.2em;
55
+ }
56
+
57
+ .cell {
58
+ margin: 1em;
59
+ }
60
+
61
+ /* Subtitle + author */
62
+ .subtitle,
63
+ .author {
64
+ color: #000000;
65
+ font-size: $h2-font-size;
66
+ font-family: $presentation-heading-font;
67
+ }
68
+
69
+ /* Footer */
70
+ .reveal .footer {
71
+ color: #000000;
72
+ font-family: $presentation-heading-font;
73
+ }
74
+
75
+ /* Slide numbers */
76
+ .reveal .slide-number {
77
+ font-family: $presentation-heading-font;
78
+ }
79
+
80
+ .slide-number {
81
+ bottom: 10px !important;
82
+ right: 10px !important;
83
+ top: unset !important;
84
+ color: #000000 !important;
85
+ }
86
+
87
+ /* Lists */
88
+ .reveal li {
89
+ padding: 10px;
90
+ }
91
+
92
+ /* Center helper */
93
+ .center-x {
94
+ text-align: center;
95
+ }
96
+
97
+ /* Dark background links */
98
+ section.has-dark-background a,
99
+ section.has-dark-background a:hover {
100
+ color: #d3d3d3;
101
+ }
102
+
103
+ .reveal .controls {
104
+ color: #15a588 !important;
105
+ }
106
+
107
+ .reveal .controls button {
108
+ color: #15a588 !important;
109
+ opacity: 1 !important; /* ensures they don’t fade */
110
+ }
111
+
112
+ .reveal .progress span {
113
+ background-color: #15a588 !important;
114
+ }
115
+
116
+ a,
117
+ a:visited {
118
+ color: #15a588 !important;
119
+ }
120
+
121
+ a:hover,
122
+ a:focus {
123
+ color: #0f7f68 !important; /* slightly darker hover */
124
+ }
125
+ .navbar {
126
+ background-color: #c8efe6 !important;
127
+ }
@@ -0,0 +1,13 @@
1
+ .navbar {
2
+ background-color: #c8efe6 !important;
3
+ }
4
+ /* Move tools to the left side */
5
+ .quarto-navbar-tools {
6
+ order: -1 !important;
7
+ margin-right: 1rem !important;
8
+ }
9
+
10
+ .navbar-nav.ms-auto {
11
+ margin-left: auto !important; /* keep right menu spacing intact */
12
+ }
13
+
@@ -0,0 +1,13 @@
1
+ /* Ultimate override for Quarto search icon */
2
+ .navbar button.quarto-search-button svg,
3
+ .navbar button.quarto-search-button svg *,
4
+ .navbar .quarto-search-icon,
5
+ .navbar .quarto-search-icon *,
6
+ .navbar svg[role="img"],
7
+ .navbar svg[role="img"] *,
8
+ .navbar svg,
9
+ .navbar svg * {
10
+ fill: #15a589 !important;
11
+ stroke: #15a589 !important;
12
+ color: #15a589 !important;
13
+ }
@@ -0,0 +1,44 @@
1
+ /* Default TOC text (black) */
2
+ #quarto-margin-sidebar #TOC .nav-link {
3
+ color: #000000 !important;
4
+ }
5
+
6
+ /* Hover state (your green) */
7
+ #quarto-margin-sidebar #TOC .nav-link:hover {
8
+ color: #15a588 !important;
9
+ }
10
+
11
+ /* Active section (your green) */
12
+ #quarto-margin-sidebar #TOC .nav-link.active {
13
+ color: #15a588 !important;
14
+ font-weight: 600;
15
+ }
16
+
17
+ /* Override Bootstrap link variables inside this TOC only */
18
+ #quarto-margin-sidebar #TOC {
19
+ --bs-link-color: #000000;
20
+ --bs-link-hover-color: #15a588;
21
+ --bs-link-active-color: #15a588;
22
+ }
23
+
24
+ /* 1. Restore the original light gray left border for ALL TOC items */
25
+ #quarto-margin-sidebar #TOC .nav-link {
26
+ border-left: 1px solid #dee2e6 !important; /* original Quarto/Cosmo gray */
27
+ box-shadow: none !important; /* remove Cosmo's blue shadow */
28
+ }
29
+
30
+ /* 2. Hover: green bar */
31
+ #quarto-margin-sidebar #TOC .nav-link:hover {
32
+ border-left: 2px solid #15a588 !important;
33
+ }
34
+
35
+ /* 3. Active (but NOT the first item): green bar */
36
+ #quarto-margin-sidebar #TOC ul > li:not(:first-child) > .nav-link.active {
37
+ border-left: 2px solid #15a588 !important;
38
+ }
39
+
40
+ /* 4. First item active: keep the light gray line, no green, no blue */
41
+ #quarto-margin-sidebar #TOC ul > li:first-child > .nav-link.active {
42
+ border-left: 1px solid #dee2e6 !important; /* restore gray */
43
+ box-shadow: none !important; /* kill Cosmo's blue shadow */
44
+ }
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 83.18%"><title>coverage: 83.18%</title><filter id="blur"><feGaussianBlur stdDeviation="16"/></filter><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#67ac09"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="315" y="150" fill-opacity=".8" filter="url(#blur)" textLength="510">coverage</text><text x="315" y="150" fill-opacity=".3" textLength="510">coverage</text></g><text x="315" y="140" textLength="510">coverage</text></g><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="865" y="150" fill-opacity=".8" filter="url(#blur)" textLength="430">83.18%</text><text x="865" y="150" fill-opacity=".3" textLength="430">83.18%</text></g><text x="865" y="140" textLength="430">83.18%</text></g></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 84.04%"><title>coverage: 84.04%</title><filter id="blur"><feGaussianBlur stdDeviation="16"/></filter><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#67ac09"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="315" y="150" fill-opacity=".8" filter="url(#blur)" textLength="510">coverage</text><text x="315" y="150" fill-opacity=".3" textLength="510">coverage</text></g><text x="315" y="140" textLength="510">coverage</text></g><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="865" y="150" fill-opacity=".8" filter="url(#blur)" textLength="430">84.04%</text><text x="865" y="150" fill-opacity=".3" textLength="430">84.04%</text></g><text x="865" y="140" textLength="430">84.04%</text></g></g></svg>
@@ -0,0 +1,127 @@
1
+ ---
2
+ title: "Developer Guide"
3
+ format:
4
+ html:
5
+ toc: true
6
+ toc-location: right
7
+ ---
8
+
9
+ ## Extending iBridges‑GUI {#extending-ibridges-gui}
10
+
11
+ iBridges‑GUI supports a modular plugin system that allows developers to add new functionality through custom tabs.
12
+ Your plugin is automatically detected and integrated into the main application at runtime.
13
+
14
+ A minimal example and template structure are available in the
15
+ **[plugin example repository](https://github.com/iBridges-for-iRODS/ibridges-gui-tab-example)**.
16
+
17
+ ## Contributing {#contributing}
18
+
19
+ iBridges‑GUI is an open‑source project, and we welcome contributions of all kinds — from bug reports and feature ideas to full pull requests.
20
+
21
+ Main repository:
22
+ **[iBridges‑GUI on GitHub](https://github.com/iBridges-for-iRODS/iBridges-GUI)**
23
+
24
+ ### Contribution workflow
25
+
26
+ 1. Fork the repository
27
+ 2. Create a feature branch from `develop`
28
+ 3. Implement your changes
29
+ 4. Submit a pull request back to `develop`
30
+
31
+ This workflow helps us review changes efficiently and maintain a clean development history.
32
+
33
+ ## Code structure overview {#code-structure-overview}
34
+
35
+ The core application lives in the
36
+ **[`ibridgesgui`](https://github.com/iBridges-for-iRODS/iBridges-GUI/tree/develop/ibridgesgui)**
37
+ package. Its architecture is modular, separating UI, logic, and iRODS operations into clear components.
38
+
39
+
40
+ ### Top-level modules {#top-level-modules}
41
+
42
+ These modules provide the core functionality used across the application:
43
+
44
+ - `__main__.py` — application entry point
45
+ - `config.py` — configuration handling
46
+ - `gui_utils.py` — shared GUI helpers
47
+ - `threads.py` — background worker threads
48
+ - `info.py` — application metadata
49
+ - `irods_tree_model.py` — iRODS tree model
50
+ - `login.py` — authentication
51
+ - `logviewer.py` — log viewer tab
52
+ - `welcome.py` — startup screen
53
+ - `md_schemas/` — metadata schema definitions
54
+
55
+
56
+ ### mainmenu/ {#mainmenu}
57
+
58
+ The orchestration layer of the application:
59
+
60
+ - `main_window.py` — main Qt window hosting all tabs
61
+ - `tab_manager.py` — loads and organizes built‑in tabs
62
+ - `plugin_manager.py` — discovers and loads plugin tabs
63
+ - `session_manager.py` — manages user session state
64
+ - `config_manager.py` — handles configuration files and user-defined settings
65
+
66
+ This directory is the best starting point for understanding how the application is assembled.
67
+
68
+
69
+ ### browsertab/ {#browsertab}
70
+
71
+ Implements the iRODS browser tab using a model–controller–view structure:
72
+
73
+ - `browser_model.py` — data model
74
+ - `browser_controller.py` — navigation and logic
75
+ - `browser.py` — UI
76
+ - `irods_browser_service.py` — iRODS operations
77
+
78
+
79
+ ### searchtab/ {#searchtab}
80
+
81
+ Implements the search interface:
82
+
83
+ - `search_model.py` — query state and results
84
+ - `search_controller.py` — executes searches and handles filters
85
+ - `search.py` — UI for building queries and viewing results
86
+
87
+
88
+ ### synctab/ {#synctab}
89
+
90
+ Implements synchronization:
91
+
92
+ - `sync_model.py` — sync state and configuration
93
+ - `sync_controller.py` — sync logic and background tasks
94
+ - `sync.py` — UI for managing sync jobs
95
+
96
+
97
+ ### popup_widgets/ {#popup-widgets}
98
+
99
+ Reusable dialogs for:
100
+
101
+ - creating collections
102
+ - creating directories
103
+ - uploading/downloading
104
+ - renaming
105
+ - metadata editing
106
+ - configuration checks
107
+ - resource tree dialogs
108
+
109
+ Each dialog has its own file, making them easy to reuse or extend.
110
+
111
+
112
+ ### ui_files/ {#ui-files}
113
+
114
+ Contains:
115
+
116
+ - Qt Designer `.ui` files
117
+ - auto‑generated Python wrappers
118
+ - matching controller/view logic
119
+
120
+ This keeps UI layout editable without touching logic.
121
+
122
+
123
+ ### icons/ {#icons}
124
+
125
+ Contains all icons used in the GUI, including navigation arrows, sync indicators, loading animations, and the application logo.
126
+
127
+