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.
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/linter.yml +5 -3
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/publish.yml +1 -1
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/pypi_release.yml +3 -3
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/tests.yml +17 -13
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.gitignore +4 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/PKG-INFO +5 -4
- ibridgesgui-2.2.0/_quarto.yml +41 -0
- ibridgesgui-2.2.0/_styles/callouts.css +39 -0
- ibridgesgui-2.2.0/_styles/code.css +6 -0
- ibridgesgui-2.2.0/_styles/hyperlinks.css +24 -0
- ibridgesgui-2.2.0/_styles/ibridges.css +127 -0
- ibridgesgui-2.2.0/_styles/navbar.css +13 -0
- ibridgesgui-2.2.0/_styles/search_icon.css +13 -0
- ibridgesgui-2.2.0/_styles/toc.css +44 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/coverage.svg +1 -1
- ibridgesgui-2.2.0/docs/developers.qmd +127 -0
- ibridgesgui-2.2.0/docs/faq.qmd +64 -0
- ibridgesgui-2.2.0/docs/getting-started.qmd +176 -0
- ibridgesgui-2.2.0/docs/info.qmd +92 -0
- ibridgesgui-2.2.0/docs/screenshots/manage_tickets.png +0 -0
- ibridgesgui-2.2.0/docs/screenshots/supply_ticket.png +0 -0
- ibridgesgui-2.2.0/docs/userdoc.qmd +255 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/_version.py +3 -3
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/browser_controller.py +1 -3
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/irods_browser_service.py +11 -4
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/gui_utils.py +7 -1
- ibridgesgui-2.2.0/ibridgesgui/icons/logo.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/info.py +13 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/login.py +6 -2
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/main_window.py +35 -8
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/session_manager.py +1 -1
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/tab_manager.py +0 -1
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/__init__.py +5 -1
- ibridgesgui-2.2.0/ibridgesgui/popup_widgets/manage_tickets.py +166 -0
- ibridgesgui-2.2.0/ibridgesgui/popup_widgets/supply_ticket.py +60 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/sync_controller.py +1 -1
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/threads.py +6 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/MainMenu.py +41 -9
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/MainMenu.ui +64 -4
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/rescTree.ui +3 -3
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabInfo.py +126 -114
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabInfo.ui +153 -139
- ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketEditor.py +211 -0
- ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketEditor.ui +233 -0
- ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketSupply.py +124 -0
- ibridgesgui-2.2.0/ibridgesgui/ui_files/ticketSupply.ui +159 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/PKG-INFO +5 -4
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/SOURCES.txt +18 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/requires.txt +2 -2
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/scm_file_list.json +134 -116
- ibridgesgui-2.2.0/ibridgesgui.egg-info/scm_version.json +8 -0
- ibridgesgui-2.2.0/index.qmd +54 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/pyproject.toml +4 -3
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/gui/test_info_tab.py +2 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_main_window.py +2 -2
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_session_manager.py +2 -2
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/conftest.py +16 -21
- ibridgesgui-2.2.0/tests/popup/test_manage_tickets.py +409 -0
- ibridgesgui-2.2.0/tests/popup/test_supply_ticket.py +180 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/test_transfer_thread.py +1 -8
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/unit/test_gui_utils.py +14 -0
- ibridgesgui-2.1.2/_quarto.yml +0 -25
- ibridgesgui-2.1.2/docs/developers.qmd +0 -12
- ibridgesgui-2.1.2/docs/faq.qmd +0 -36
- ibridgesgui-2.1.2/docs/getting-started.qmd +0 -101
- ibridgesgui-2.1.2/docs/info.qmd +0 -68
- ibridgesgui-2.1.2/docs/userdoc.qmd +0 -148
- ibridgesgui-2.1.2/ibridgesgui.egg-info/scm_version.json +0 -8
- ibridgesgui-2.1.2/index.qmd +0 -14
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.flake8 +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/dependabot.yml +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/.github/workflows/nuitka_release.yml +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/LICENSE +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/README.md +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/build_tools/build_script.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/build_tools/ui_to_py.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/add_check_config.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/add_new_config.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/browser.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/login.png +0 -0
- {ibridgesgui-2.1.2/ibridgesgui/icons → ibridgesgui-2.2.0/docs/screenshots}/logo.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/metadata.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/permissions.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/replicas.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/search.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/start_ibridges.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/docs/screenshots/sync.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/__init__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/__main__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/__init__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/browser.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/browsertab/browser_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/config.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/arrow-left.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/arrow-right.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/arrow-up.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/christmas-logo.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/home.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/iBridges.ico +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/loading_circle.gif +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/nosync.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/refresh.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/icons/syncing.png +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/irods_tree_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/logviewer.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/__init__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/config_manager.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/mainmenu/plugin_manager.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/md_schemas/ibridges_metadata_schema.json +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/base.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/check_config.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/create_collection.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/create_directory.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/download_data.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/rename_item.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/resc_tree.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/popup_widgets/upload_data.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/__init__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/search.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/search_controller.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/searchtab/search_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/__init__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/sync.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/synctab/sync_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/__init__.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/configCheck.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/configCheck.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/createCollection.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/createCollection.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/downloadData.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/downloadData.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/irodsLogin.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/irodsLogin.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/renameItem.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/renameItem.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/rescTree.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabBrowser.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabBrowser.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabLogging.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabLogging.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSearch.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSearch.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSync.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/tabSync.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/transferData.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/transferData.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/uploadData.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/uploadData.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/welcome.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/ui_files/welcome.ui +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui/welcome.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/dependency_links.txt +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/ibridgesgui.egg-info/top_level.txt +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/setup.cfg +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/conftest.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/test_browser_controller.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/test_browser_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/browser/test_irods_browser_service.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/conftest.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/gui/test_login.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/gui/test_main.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/conftest.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_config_manager.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/main_window/test_tab_manager.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_check_config.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_download_data.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_simple_dialogs.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_transfer_dialog_base.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/popup/test_upload_data.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/search/conftest.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/search/test_search_controller.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/search/test_search_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/sync/conftest.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/sync/test_sync_controller.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/sync/test_sync_model.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/conftest.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/test_search_thread.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/threads/test_sync_thread.py +0 -0
- {ibridgesgui-2.1.2 → ibridgesgui-2.2.0}/tests/unit/test_config.py +0 -0
- {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.
|
|
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@
|
|
41
|
+
- uses: actions/checkout@v5
|
|
40
42
|
|
|
41
43
|
- name: Set up Python ${{ matrix.python-version }}
|
|
42
|
-
uses: actions/setup-python@
|
|
44
|
+
uses: actions/setup-python@v5
|
|
43
45
|
with:
|
|
44
46
|
python-version: ${{ matrix.python-version }}
|
|
45
47
|
|
|
@@ -24,9 +24,9 @@ jobs:
|
|
|
24
24
|
runs-on: ubuntu-latest
|
|
25
25
|
|
|
26
26
|
steps:
|
|
27
|
-
- uses: actions/checkout@
|
|
27
|
+
- uses: actions/checkout@v5
|
|
28
28
|
- name: Set up Python
|
|
29
|
-
uses: actions/setup-python@
|
|
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
|
|
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.
|
|
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@
|
|
36
|
+
uses: actions/checkout@v6
|
|
25
37
|
|
|
26
38
|
- name: Set up Python
|
|
27
|
-
uses: actions/setup-python@
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ibridgesgui
|
|
3
|
-
Version: 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.
|
|
525
|
-
Requires-Dist: setproctitle==1.3.
|
|
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,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:
|
|
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
|
+
|