ibridgesgui 2.0.0__tar.gz → 2.1.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 (166) hide show
  1. ibridgesgui-2.1.0/.github/workflows/tests.yml +94 -0
  2. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.gitignore +4 -3
  3. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/PKG-INFO +9 -5
  4. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/README.md +4 -3
  5. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/_quarto.yml +2 -0
  6. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/build_tools/build_script.py +7 -1
  7. ibridgesgui-2.1.0/coverage.svg +1 -0
  8. ibridgesgui-2.1.0/docs/faq.qmd +36 -0
  9. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/getting-started.qmd +5 -5
  10. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/info.qmd +6 -6
  11. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/userdoc.qmd +1 -1
  12. ibridgesgui-2.1.0/ibridgesgui/__main__.py +50 -0
  13. ibridgesgui-2.1.0/ibridgesgui/_version.py +24 -0
  14. ibridgesgui-2.1.0/ibridgesgui/browsertab/__init__.py +1 -0
  15. ibridgesgui-2.1.0/ibridgesgui/browsertab/browser.py +105 -0
  16. ibridgesgui-2.1.0/ibridgesgui/browsertab/browser_controller.py +365 -0
  17. ibridgesgui-2.1.0/ibridgesgui/browsertab/browser_model.py +119 -0
  18. ibridgesgui-2.1.0/ibridgesgui/browsertab/irods_browser_service.py +192 -0
  19. ibridgesgui-2.1.0/ibridgesgui/config.py +384 -0
  20. ibridgesgui-2.1.0/ibridgesgui/gui_utils.py +193 -0
  21. ibridgesgui-2.1.0/ibridgesgui/info.py +86 -0
  22. ibridgesgui-2.1.0/ibridgesgui/irods_tree_model.py +139 -0
  23. ibridgesgui-2.1.0/ibridgesgui/login.py +226 -0
  24. ibridgesgui-2.1.0/ibridgesgui/logviewer.py +58 -0
  25. ibridgesgui-2.1.0/ibridgesgui/mainmenu/__init__.py +13 -0
  26. ibridgesgui-2.1.0/ibridgesgui/mainmenu/config_manager.py +91 -0
  27. ibridgesgui-2.1.0/ibridgesgui/mainmenu/main_window.py +126 -0
  28. ibridgesgui-2.1.0/ibridgesgui/mainmenu/plugin_manager.py +63 -0
  29. ibridgesgui-2.1.0/ibridgesgui/mainmenu/session_manager.py +74 -0
  30. ibridgesgui-2.1.0/ibridgesgui/mainmenu/tab_manager.py +102 -0
  31. ibridgesgui-2.1.0/ibridgesgui/md_schemas/ibridges_metadata_schema.json +54 -0
  32. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/__init__.py +17 -0
  33. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/base.py +60 -0
  34. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/check_config.py +190 -0
  35. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/create_collection.py +47 -0
  36. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/create_directory.py +45 -0
  37. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/download_data.py +167 -0
  38. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/rename_item.py +49 -0
  39. ibridgesgui-2.1.0/ibridgesgui/popup_widgets/upload_data.py +271 -0
  40. ibridgesgui-2.1.0/ibridgesgui/searchtab/__init__.py +1 -0
  41. ibridgesgui-2.1.0/ibridgesgui/searchtab/search.py +109 -0
  42. ibridgesgui-2.1.0/ibridgesgui/searchtab/search_controller.py +320 -0
  43. ibridgesgui-2.1.0/ibridgesgui/searchtab/search_model.py +74 -0
  44. ibridgesgui-2.1.0/ibridgesgui/synctab/__init__.py +1 -0
  45. ibridgesgui-2.1.0/ibridgesgui/synctab/sync.py +71 -0
  46. ibridgesgui-2.1.0/ibridgesgui/synctab/sync_controller.py +343 -0
  47. ibridgesgui-2.1.0/ibridgesgui/synctab/sync_model.py +29 -0
  48. ibridgesgui-2.1.0/ibridgesgui/threads.py +276 -0
  49. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabInfo.py +7 -3
  50. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabInfo.ui +5 -0
  51. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabSearch.py +108 -66
  52. ibridgesgui-2.1.0/ibridgesgui/ui_files/tabSearch.ui +486 -0
  53. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/uploadData.py +80 -58
  54. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/uploadData.ui +97 -65
  55. ibridgesgui-2.1.0/ibridgesgui/welcome.py +54 -0
  56. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/PKG-INFO +9 -5
  57. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/SOURCES.txt +64 -5
  58. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/requires.txt +4 -1
  59. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/pyproject.toml +23 -2
  60. ibridgesgui-2.1.0/tests/browser/conftest.py +102 -0
  61. ibridgesgui-2.1.0/tests/browser/test_browser_controller.py +473 -0
  62. ibridgesgui-2.1.0/tests/browser/test_browser_model.py +87 -0
  63. ibridgesgui-2.1.0/tests/browser/test_irods_browser_service.py +281 -0
  64. ibridgesgui-2.1.0/tests/conftest.py +49 -0
  65. ibridgesgui-2.1.0/tests/gui/test_info_tab.py +127 -0
  66. ibridgesgui-2.1.0/tests/gui/test_login.py +303 -0
  67. ibridgesgui-2.1.0/tests/gui/test_main.py +49 -0
  68. ibridgesgui-2.1.0/tests/main_window/conftest.py +136 -0
  69. ibridgesgui-2.1.0/tests/main_window/test_config_manager.py +57 -0
  70. ibridgesgui-2.1.0/tests/main_window/test_main_window.py +151 -0
  71. ibridgesgui-2.1.0/tests/main_window/test_session_manager.py +223 -0
  72. ibridgesgui-2.1.0/tests/main_window/test_tab_manager.py +195 -0
  73. ibridgesgui-2.1.0/tests/popup/conftest.py +142 -0
  74. ibridgesgui-2.1.0/tests/popup/test_check_config.py +148 -0
  75. ibridgesgui-2.1.0/tests/popup/test_download_data.py +221 -0
  76. ibridgesgui-2.1.0/tests/popup/test_simple_dialogs.py +72 -0
  77. ibridgesgui-2.1.0/tests/popup/test_transfer_dialog_base.py +49 -0
  78. ibridgesgui-2.1.0/tests/popup/test_upload_data.py +279 -0
  79. ibridgesgui-2.1.0/tests/search/conftest.py +152 -0
  80. ibridgesgui-2.1.0/tests/search/test_search_controller.py +416 -0
  81. ibridgesgui-2.1.0/tests/search/test_search_model.py +174 -0
  82. ibridgesgui-2.1.0/tests/sync/conftest.py +77 -0
  83. ibridgesgui-2.1.0/tests/sync/test_sync_controller.py +355 -0
  84. ibridgesgui-2.1.0/tests/sync/test_sync_model.py +47 -0
  85. ibridgesgui-2.1.0/tests/threads/conftest.py +85 -0
  86. ibridgesgui-2.1.0/tests/threads/test_search_thread.py +103 -0
  87. ibridgesgui-2.1.0/tests/threads/test_sync_thread.py +97 -0
  88. ibridgesgui-2.1.0/tests/threads/test_transfer_thread.py +153 -0
  89. ibridgesgui-2.1.0/tests/unit/test_config.py +409 -0
  90. ibridgesgui-2.1.0/tests/unit/test_gui_utils.py +217 -0
  91. ibridgesgui-2.1.0/tests/unit/test_irods_tree_model.py +175 -0
  92. ibridgesgui-2.0.0/ibridgesgui/__main__.py +0 -318
  93. ibridgesgui-2.0.0/ibridgesgui/_version.py +0 -34
  94. ibridgesgui-2.0.0/ibridgesgui/browser.py +0 -552
  95. ibridgesgui-2.0.0/ibridgesgui/config.py +0 -425
  96. ibridgesgui-2.0.0/ibridgesgui/gui_utils.py +0 -207
  97. ibridgesgui-2.0.0/ibridgesgui/info.py +0 -53
  98. ibridgesgui-2.0.0/ibridgesgui/irods_tree_model.py +0 -160
  99. ibridgesgui-2.0.0/ibridgesgui/login.py +0 -174
  100. ibridgesgui-2.0.0/ibridgesgui/logviewer.py +0 -47
  101. ibridgesgui-2.0.0/ibridgesgui/popup_widgets.py +0 -599
  102. ibridgesgui-2.0.0/ibridgesgui/search.py +0 -347
  103. ibridgesgui-2.0.0/ibridgesgui/sync.py +0 -300
  104. ibridgesgui-2.0.0/ibridgesgui/threads.py +0 -252
  105. ibridgesgui-2.0.0/ibridgesgui/ui_files/tabSearch.ui +0 -468
  106. ibridgesgui-2.0.0/ibridgesgui/welcome.py +0 -46
  107. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.flake8 +0 -0
  108. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  109. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  110. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/dependabot.yml +0 -0
  111. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/linter.yml +0 -0
  112. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/nuitka_release.yml +0 -0
  113. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/publish.yml +0 -0
  114. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/pypi_release.yml +0 -0
  115. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/LICENSE +0 -0
  116. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/build_tools/ui_to_py.py +0 -0
  117. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/developers.qmd +0 -0
  118. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/add_check_config.png +0 -0
  119. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/add_new_config.png +0 -0
  120. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/browser.png +0 -0
  121. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/login.png +0 -0
  122. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/metadata.png +0 -0
  123. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/permissions.png +0 -0
  124. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/replicas.png +0 -0
  125. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/search.png +0 -0
  126. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/start_ibridges.png +0 -0
  127. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/sync.png +0 -0
  128. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/__init__.py +0 -0
  129. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/arrow-left.png +0 -0
  130. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/arrow-right.png +0 -0
  131. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/arrow-up.png +0 -0
  132. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/christmas-logo.png +0 -0
  133. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/home.png +0 -0
  134. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/iBridges.ico +0 -0
  135. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/loading_circle.gif +0 -0
  136. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/logo.png +0 -0
  137. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/nosync.png +0 -0
  138. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/refresh.png +0 -0
  139. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/syncing.png +0 -0
  140. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/MainMenu.py +0 -0
  141. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/MainMenu.ui +0 -0
  142. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/__init__.py +0 -0
  143. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/configCheck.py +0 -0
  144. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/configCheck.ui +0 -0
  145. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/createCollection.py +0 -0
  146. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/createCollection.ui +0 -0
  147. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/downloadData.py +0 -0
  148. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/downloadData.ui +0 -0
  149. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/irodsLogin.py +0 -0
  150. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/irodsLogin.ui +0 -0
  151. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/renameItem.py +0 -0
  152. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/renameItem.ui +0 -0
  153. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabBrowser.py +0 -0
  154. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabBrowser.ui +0 -0
  155. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabLogging.py +0 -0
  156. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabLogging.ui +0 -0
  157. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabSync.py +0 -0
  158. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabSync.ui +0 -0
  159. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/transferData.py +0 -0
  160. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/transferData.ui +0 -0
  161. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/welcome.py +0 -0
  162. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/welcome.ui +0 -0
  163. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/dependency_links.txt +0 -0
  164. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/top_level.txt +0 -0
  165. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/index.qmd +0 -0
  166. {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/setup.cfg +0 -0
@@ -0,0 +1,94 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ build:
13
+ strategy:
14
+ fail-fast: true
15
+ matrix:
16
+ os: [ubuntu-latest]
17
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
18
+ include:
19
+ - os: macos-latest
20
+ python-version: "3.13"
21
+ runs-on: ${{ matrix.os }}
22
+ steps:
23
+ - name: Checkout
24
+ uses: actions/checkout@v4
25
+
26
+ - name: Set up Python
27
+ uses: actions/setup-python@v5
28
+ with:
29
+ python-version: ${{ matrix.python-version }}
30
+
31
+ # -----------------------------
32
+ # Linux-only Qt dependencies
33
+ # -----------------------------
34
+ - name: Install Qt system dependencies (Linux)
35
+ if: runner.os == 'Linux'
36
+ run: |
37
+ sudo apt-get update
38
+ sudo apt-get install -y \
39
+ libegl1 \
40
+ libgl1-mesa-dev \
41
+ libxkbcommon-x11-0 \
42
+ libxcb-icccm4 \
43
+ libxcb-image0 \
44
+ libxcb-keysyms1 \
45
+ libxcb-randr0 \
46
+ libxcb-render-util0 \
47
+ libxcb-xinerama0 \
48
+ libxcb-xfixes0 \
49
+ xvfb
50
+
51
+ # -----------------------------
52
+ # Install Python dependencies
53
+ # -----------------------------
54
+ - name: Install dependencies
55
+ run: |
56
+ python -m pip install --upgrade pip
57
+ python -m pip install .[test]
58
+ python -m pip install pytest pytest-cov
59
+
60
+ # -----------------------------
61
+ # Set Qt to offscreen mode
62
+ # -----------------------------
63
+ - name: Configure Qt for headless mode
64
+ run: |
65
+ echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV
66
+ - name: Configure Qt for headless mode (macOS)
67
+ if: runner.os == 'macOS'
68
+ run: |
69
+ echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV
70
+ echo "QT_MAC_WANTS_LAYER=1" >> $GITHUB_ENV
71
+
72
+ # -----------------------------
73
+ # Run tests
74
+ # -----------------------------
75
+ - name: Run tests and coverage
76
+ run: |
77
+ python -m pytest --cov=ibridgesgui --cov-report=xml --cov-report=term-missing --cov-fail-under=70 tests
78
+
79
+ - name: Install badge generator
80
+ run: pip install genbadge[coverage]
81
+ - name: Generate coverage badge
82
+ run: genbadge coverage -i coverage.xml -o coverage.svg
83
+
84
+ - name: Commit coverage badge
85
+ if: github.event_name == 'push' &&
86
+ matrix.python-version == '3.13' &&
87
+ matrix.os == 'ubuntu-latest'
88
+ run: |
89
+ git config user.name "github-actions"
90
+ git config user.email "github-actions@github.com"
91
+ git add coverage.svg
92
+ git commit -m "Update coverage badge" || echo "No changes to commit"
93
+ git push
94
+
@@ -1,9 +1,10 @@
1
1
  # Local additions
2
- .idea
3
- irods-basicGUI/logs/*
4
- irods-iBridgesGui.spec
5
2
  *DS_Store
6
3
  ibridgesgui/_version.py
4
+ # Vim swap files
5
+ *.swp
6
+ *.swo
7
+ *.swx
7
8
 
8
9
  # Byte-compiled / optimized / DLL files
9
10
  __pycache__/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ibridgesgui
3
- Version: 2.0.0
3
+ Version: 2.1.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
@@ -521,15 +521,18 @@ Requires-Python: >=3.9
521
521
  Description-Content-Type: text/markdown
522
522
  License-File: LICENSE
523
523
  Requires-Dist: PySide6>=6.8.1
524
- Requires-Dist: ibridges<2.1,>=2.0.0
524
+ Requires-Dist: ibridges<2.2,>=2.1.0
525
525
  Requires-Dist: setproctitle==1.3.7
526
526
  Requires-Dist: importlib-resources; python_version <= "3.10"
527
+ Requires-Dist: jsonschema
527
528
  Provides-Extra: test
528
529
  Requires-Dist: pylint; extra == "test"
529
530
  Requires-Dist: pytest; extra == "test"
530
531
  Requires-Dist: pytest-cov; extra == "test"
531
532
  Requires-Dist: ruff; extra == "test"
532
533
  Requires-Dist: mypy; extra == "test"
534
+ Requires-Dist: pytest-qt; extra == "test"
535
+ Requires-Dist: PySide6-Essentials; extra == "test"
533
536
  Provides-Extra: deploy
534
537
  Requires-Dist: Nuitka; extra == "deploy"
535
538
  Requires-Dist: imageio; extra == "deploy"
@@ -550,6 +553,7 @@ Dynamic: license-file
550
553
 
551
554
  [![Python package](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/linter.yml/badge.svg)](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/linter.yml)
552
555
  [![Quarto Publish](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/publish.yml/badge.svg)](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/publish.yml)
556
+ ![Coverage](coverage.svg)
553
557
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.12583957.svg)](https://doi.org/10.5281/zenodo.17139123)
554
558
 
555
559
 
@@ -615,8 +619,8 @@ Please note, that this feature is still in experimental state.
615
619
 
616
620
  ### Prebuilt executables
617
621
  Go to the [Releases page](https://github.com/iBridges-for-iRODS/iBridges-GUI/releases). In the latest releases you will find three zip-files, these contain the prebuilt application.
618
- Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe, sh]`
619
- For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.sh`.
622
+ Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe, bin]`
623
+ For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.bin`.
620
624
 
621
625
 
622
626
  ### Building Executables
@@ -648,7 +652,7 @@ options:
648
652
  This will create a virtual environment `venv` in your iBridges folder. Next to that you will find a new folder `build` and `ibridgesgui_dist`. The executable can be found and started like this for Mac and Linux:
649
653
 
650
654
  ```
651
- ./output/ibridgesgui/ibridges_gui.bin
655
+ ./ibridgesgui_dist/ibridgesgui/ibridges_gui.bin
652
656
  ```
653
657
 
654
658
  For Windows simply click on the file `output/ibridgesgui/ibridges_gui.exe`.
@@ -11,6 +11,7 @@
11
11
 
12
12
  [![Python package](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/linter.yml/badge.svg)](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/linter.yml)
13
13
  [![Quarto Publish](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/publish.yml/badge.svg)](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/publish.yml)
14
+ ![Coverage](coverage.svg)
14
15
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.12583957.svg)](https://doi.org/10.5281/zenodo.17139123)
15
16
 
16
17
 
@@ -76,8 +77,8 @@ Please note, that this feature is still in experimental state.
76
77
 
77
78
  ### Prebuilt executables
78
79
  Go to the [Releases page](https://github.com/iBridges-for-iRODS/iBridges-GUI/releases). In the latest releases you will find three zip-files, these contain the prebuilt application.
79
- Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe, sh]`
80
- For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.sh`.
80
+ Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe, bin]`
81
+ For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.bin`.
81
82
 
82
83
 
83
84
  ### Building Executables
@@ -109,7 +110,7 @@ options:
109
110
  This will create a virtual environment `venv` in your iBridges folder. Next to that you will find a new folder `build` and `ibridgesgui_dist`. The executable can be found and started like this for Mac and Linux:
110
111
 
111
112
  ```
112
- ./output/ibridgesgui/ibridges_gui.bin
113
+ ./ibridgesgui_dist/ibridgesgui/ibridges_gui.bin
113
114
  ```
114
115
 
115
116
  For Windows simply click on the file `output/ibridgesgui/ibridges_gui.exe`.
@@ -15,6 +15,8 @@ website:
15
15
  text: Documentation
16
16
  - href: docs/developers.qmd
17
17
  text: Contributing to iBridges
18
+ - href: docs/faq.qmd
19
+ text: FAQ
18
20
 
19
21
  format:
20
22
  html:
@@ -59,10 +59,14 @@ def create_exe(args):
59
59
  {args.code_folder.joinpath('__main__.py')} --quiet"
60
60
  uipy.run_cmd(cmd)
61
61
 
62
- # Step 4, move the icons folder to the distribution folder
62
+ # Step 4, move the icons and mdschema folder to the distribution folder
63
+ print(f"Moving {args.icons_folder} --> {args.icons_folder.parent.parent.joinpath('__main__.dist', args.icons_folder)}")
63
64
  replace_folder(args.icons_folder,
64
65
  args.icons_folder.parent.parent.joinpath('__main__.dist',
65
66
  args.icons_folder.name))
67
+ replace_folder(args.mdschema_folder,
68
+ args.mdschema_folder.parent.parent.joinpath('__main__.dist',
69
+ args.mdschema_folder.name))
66
70
 
67
71
  # Step 5, rename the distribution folder and file
68
72
  shipping_folder = Path('ibridgesgui_dist')
@@ -86,6 +90,8 @@ if __name__ == "__main__":
86
90
  parser.add_argument('--ui_folder', default=default_code_folder.joinpath('ui_files'),
87
91
  type=Path, required=False,
88
92
  help='Full path to the directory with ui files')
93
+ parser.add_argument('--mdschema_folder', default=default_code_folder.joinpath('md_schemas'), type=Path,
94
+ help='Full path to the directory with the valid metadata schemas.')
89
95
  parser.add_argument('--icons_folder', default=default_code_folder.joinpath('icons'),
90
96
  type=Path, required=False,
91
97
  help='Full path to the directory with the icons')
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 85.90%"><title>coverage: 85.90%</title><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" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#97ca00"/><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"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">85.90%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">85.90%</text></g></svg>
@@ -0,0 +1,36 @@
1
+ # Frequently Asked Questions
2
+
3
+ If you cannot find your question here, please also take a look at our [API and CLI FAQ](https://ibridges.readthedocs.io/en/latest/faq.html).
4
+
5
+ ## I found a bug or have a feature request, where do I go?
6
+
7
+ Our development is done on [GitHub](https://github.com/iBridges-for-iRODS/iBridges-GUI).
8
+
9
+ Look under the *Issues* section whether the bug or feature request has already been reported. If not, we heartily welcome creating a new issue. We try to get back to you as soon as possible, at least within a few days.
10
+
11
+ ## Help, I’m getting a “NetworkError” while trying to transfer (large) files
12
+
13
+ This error is most likely to happen if you try to transfer a large file. The default timeout for iBridges is 25000 seconds, which translates to roughly 7 hours. This should not cause issues during the actual transfer. However, if the calculation of the checksum takes more than 7 hours (if the iRODS server is busy for example, or the file is many terabytes), then you will get a network error. The checksum itself should still be created.
14
+
15
+ You can increase the timeout in your `irods_environment.json` file by adding a new entry with `"connection_timeout": <time in seconds>,`.
16
+
17
+ Note, that the **maximum number equals 292 years**, i.e. `"connection_timeout": 9208512000,`.
18
+
19
+ ## My metadata with keys starting with `org_` do not show up in the iBridges metadata.
20
+
21
+ By default, iBridges does not show metadata that contain a key starting with the prefix *org_*. This is due to data security reasons on Yoda systems.
22
+
23
+ You can omit that only by using the [iBridges API](https://ibridges.readthedocs.io/en/latest/faq.html#my-metadata-with-keys-starting-with-org-do-not-show-up-in-the-ibridges-metadata).
24
+
25
+ ## How can I download files that follow a certain pattern but do not lie in the same collection?
26
+
27
+ You can use the *Search* for this. With the search mask you can filter for specific data no matter where they are located. In the results table you can select those files you would like to download.
28
+
29
+ ## How do I find all the data I have access to?
30
+
31
+ When data is shared in iRODS it is not always easy to know where the shared data lies as they are not visible from your "home" collection or project collection.
32
+
33
+ However, shared data objects always need to lie in a collection that you can access, it's an iRODS feature.
34
+
35
+ So again the *Search* can help you out here. Direct the search to `/yourZone/home`, select `Obj/Coll name: %` and select `Collections` (unselect `Data Objects`).
36
+ The result will show you all collections you have access to.
@@ -1,7 +1,7 @@
1
- # Getting started with iBridges-Gui
1
+ # Getting started with iBridges GUI
2
2
 
3
3
 
4
- ## Install iBridges-gui
4
+ ## Install iBridges GUI
5
5
 
6
6
  ```
7
7
  pip install ibridgesgui
@@ -9,9 +9,9 @@ pip install ibridgesgui
9
9
 
10
10
  ## Start the program
11
11
 
12
- Please start **iBridges-Gui** by typing `ibridges gui` on your terminal and hit enter.
12
+ Please start **iBridges GUI** by typing `ibridges gui` on your terminal and hit enter.
13
13
 
14
- ## Configuring iBridges-Gui
14
+ ## Configuring iBridges GUI
15
15
 
16
16
  To connect to the server you need a configuration file, a so-called `irods_environment.json`.
17
17
  You can create one for yourself using templates, editing default settings we provide for you or simply create such a file.
@@ -74,7 +74,7 @@ usage: build_script.py [-h] [--debug_exe] [--rem_venv]
74
74
  [--code_folder CODE_FOLDER] [--ui_folder UI_FOLDER]
75
75
  [--icons_folder ICONS_FOLDER] [--venv VENV]
76
76
 
77
- iBridges-Gui exe creator.
77
+ iBridges-GUI exe creator.
78
78
 
79
79
  options:
80
80
  -h, --help show this help message and exit
@@ -1,8 +1,8 @@
1
1
  ---
2
- title: "What is iBridges-Gui"
2
+ title: "What is iBridges GUI"
3
3
  ---
4
4
 
5
- [iBridges-Gui](https://github.com/chStaiger/iBridges-Gui) is a graphical user interface to the python package [iBridges](https://github.com/UtrechtUniversity/iBridges), it provides users of *Windows, Linux and Mac* with a *graphical user interface* to interact with **iRODS** servers.
5
+ [iBridges-GUI](https://github.com/iBridges-for-iRODS/iBridges-GUI) is a graphical user interface to the python package [iBridges](https://github.com/UtrechtUniversity/iBridges), it provides users of *Windows, Linux and Mac* with a *graphical user interface* to interact with **iRODS** servers.
6
6
  The tool is agnostic to any rules/policies in the server. The out-of-the-box iBridges supports three main functions: browsing through iRODS collections, upload/download and synchronisation of data, manipulate iRODS metadata and search through data collections.
7
7
 
8
8
  ## Current features
@@ -29,17 +29,17 @@ We test our code on iRODS servers with versions
29
29
 
30
30
  ```
31
31
  pip install ibridges
32
- pip install git+https://github.com/chStaiger/iBridges-Gui.git@main
32
+ pip install git+https://github.com/iBridges-for-iRODS/iBridges-GUI.git@main
33
33
  ```
34
34
 
35
35
  ### Development version
36
36
 
37
37
  ```
38
38
  pip install ibridges
39
- pip install git+https://github.com/chStaiger/iBridges-Gui.git@develop
39
+ pip install git+https://github.com/iBridges-for-iRODS/iBridges-GUI.git@develop
40
40
  ```
41
41
 
42
- Start the application by calling `ibridges-gui` on your commandline.
42
+ Start the application by calling `ibridges gui` on your commandline.
43
43
 
44
44
  ## Authors
45
45
  **Christine Staiger (Maintainer) [ORCID](https://orcid.org/0000-0002-6754-7647)**
@@ -60,7 +60,7 @@ Start the application by calling `ibridges-gui` on your commandline.
60
60
  *University of Groningen, Center for Information Technology*, 2022
61
61
 
62
62
  ## Contributing
63
- Our development is done on GitHub](https://github.com/chStaiger/iBridges-Gui). We are welcoming contributions by pull requests. You can also ask for new features/ideas in our issue tracker.
63
+ Our development is done on GitHub](https://github.com/iBridges-for-iRODS/iBridges-GUI). We are welcoming contributions by pull requests. You can also ask for new features/ideas in our issue tracker.
64
64
 
65
65
 
66
66
 
@@ -30,7 +30,7 @@ When you successfully logged into iRODS the first view you will see is the **Bro
30
30
 
31
31
  ### Navigation
32
32
 
33
- - The navigation shows an **editable field**, which contains your current iRODS path. When you just started iBridges-Gui it will point to your `irods_home` setting in the configuration file.
33
+ - The navigation shows an **editable field**, which contains your current iRODS path. When you just started iBridges GUI it will point to your `irods_home` setting in the configuration file.
34
34
  You can **navigate to another part of the iRODS collection tree** by editing this field and hitting `<Enter>`.
35
35
 
36
36
  - The **three buttons** next to the editable navigation field are `Refresh` (circle arrows) to refresh the list below the navigation section , Navigate `one level up` (up arrow) and navigate to your `home` collection (little house).
@@ -0,0 +1,50 @@
1
+ """main app."""
2
+ from __future__ import annotations
3
+
4
+ import os
5
+ import sys
6
+
7
+ import setproctitle
8
+ from PySide6.QtWidgets import QApplication, QStackedWidget
9
+
10
+ from ibridgesgui import config as config_module
11
+ from ibridgesgui.mainmenu import ConfigManager
12
+ from ibridgesgui.mainmenu.main_window import MainWindow
13
+
14
+ THIS_APPLICATION = "ibridges-gui"
15
+
16
+
17
+ def main(session=None) -> None:
18
+ """Start app."""
19
+ setproctitle.setproctitle(THIS_APPLICATION)
20
+
21
+ # Load GUI config
22
+ cfg = ConfigManager()
23
+
24
+ # Logging level from config
25
+ level = cfg.get_log_level() or "debug"
26
+
27
+ # IMPORTANT: call init_logger from the MODULE, not the ConfigManager
28
+ logger = config_module.init_logger(THIS_APPLICATION, level)
29
+ logger.info("Starting application")
30
+
31
+ # Ensure ~/.irods exists
32
+ config_module.ensure_irods_location()
33
+
34
+ # Set working directory
35
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
36
+
37
+ # Qt app
38
+ app = QApplication(sys.argv)
39
+ container = QStackedWidget()
40
+
41
+ # Main window
42
+ window = MainWindow(THIS_APPLICATION, session, cfg)
43
+ container.addWidget(window)
44
+ container.show()
45
+
46
+ app.exec()
47
+
48
+
49
+ if __name__ == "__main__":
50
+ main()
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '2.1.0'
22
+ __version_tuple__ = version_tuple = (2, 1, 0)
23
+
24
+ __commit_id__ = commit_id = 'g97bdf8817'
@@ -0,0 +1 @@
1
+ """Browser tab."""
@@ -0,0 +1,105 @@
1
+ """Browser widget."""
2
+
3
+ import sys
4
+
5
+ import PySide6.QtWidgets
6
+
7
+ from ibridgesgui.browsertab.browser_controller import BrowserController
8
+ from ibridgesgui.gui_utils import UI_FILE_DIR, get_irods_item, load_ui, populate_table
9
+ from ibridgesgui.ui_files.tabBrowser import Ui_tabBrowser
10
+
11
+
12
+ class Browser(PySide6.QtWidgets.QWidget, Ui_tabBrowser):
13
+ """Browser view for iRODS session (UI only, logic in BrowserController)."""
14
+
15
+ def __init__(self, session, app_name: str):
16
+ """Init."""
17
+ super().__init__()
18
+
19
+ if getattr(sys, "frozen", False) or ("__compiled__" in globals()):
20
+ super().setupUi(self)
21
+ else:
22
+ load_ui(UI_FILE_DIR / "tabBrowser.ui", self)
23
+
24
+ self.controller = BrowserController(self, session, app_name)
25
+ self.controller.init_browser()
26
+
27
+ # --- Rendering helpers moved from controller ---
28
+
29
+ def render_metadata(self, data, irods_path):
30
+ """Render metadata table."""
31
+ self.meta_key_field.clear()
32
+ self.meta_value_field.clear()
33
+ self.meta_units_field.clear()
34
+ self.no_meta_label.clear()
35
+
36
+ populate_table(self.meta_table, len(data), data)
37
+ current_tab = self.info_tabs.currentWidget().objectName()
38
+ if current_tab == "metadata" and len(data) == 0:
39
+ self.no_meta_label.setText(f"Metadata for {irods_path} is empty.")
40
+ self.meta_table.resizeColumnsToContents()
41
+
42
+ def render_acls(self, clean, irods_path):
43
+ """Render ACL table."""
44
+ self.acl_table.setRowCount(0)
45
+ self.acl_user_field.clear()
46
+ self.acl_zone_field.clear()
47
+ self.acl_box.clear()
48
+ self.recursive_box.setEnabled(irods_path.collection_exists())
49
+
50
+ obj_acl = ["read", "write", "own", "delete"]
51
+ coll_acl = obj_acl + [
52
+ "Newly added items to collection will inherit permissions",
53
+ "Remove inheritance.",
54
+ ]
55
+
56
+ for item in coll_acl if irods_path.collection_exists() else obj_acl:
57
+ self.acl_box.addItem(item)
58
+ self.acl_box.setEnabled(True)
59
+
60
+ populate_table(self.acl_table, len(clean), clean)
61
+ self.acl_table.resizeColumnsToContents()
62
+
63
+ obj = get_irods_item(irods_path)
64
+ self.owner_label.setText(obj.owner_name)
65
+
66
+ def render_replicas(self, rows):
67
+ """Render replicas table."""
68
+ self.replica_table.setRowCount(0)
69
+ if rows:
70
+ populate_table(self.replica_table, len(rows), rows)
71
+ self.replica_table.resizeColumnsToContents()
72
+
73
+ def clear_info_tabs(self):
74
+ """Creal all info tabs."""
75
+ self.acl_table.setRowCount(0)
76
+ self.meta_table.setRowCount(0)
77
+ self.replica_table.setRowCount(0)
78
+ self.preview_browser.clear()
79
+ self.no_meta_label.clear()
80
+
81
+ def on_tab_changed(self):
82
+ """Clear the metadata label when switching tabs."""
83
+ self.no_meta_label.clear()
84
+
85
+ def load_metadata_item(self, index):
86
+ """Load selected metadata row into edit fields."""
87
+ row = index.row()
88
+ key = self.meta_table.item(row, 0).text()
89
+ val = self.meta_table.item(row, 1).text()
90
+ units = self.meta_table.item(row, 2).text() if self.meta_table.item(row, 2) else ""
91
+ self.meta_key_field.setText(key)
92
+ self.meta_value_field.setText(val)
93
+ self.meta_units_field.setText(units)
94
+
95
+ def load_permission(self, index):
96
+ """Load selected ACL row into edit fields."""
97
+ row = index.row()
98
+ user = self.acl_table.item(row, 0).text()
99
+ zone = self.acl_table.item(row, 1).text()
100
+ acc = self.acl_table.item(row, 2).text()
101
+
102
+ self.acl_user_field.setText(user)
103
+ self.acl_zone_field.setText(zone)
104
+ self.acl_box.setCurrentText(acc)
105
+ self.recursive_box.setCurrentText("False")