scipion-pyworkflow 3.11.1__tar.gz → 3.11.2__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 (173) hide show
  1. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/CHANGES.txt +18 -0
  2. {scipion_pyworkflow-3.11.1/scipion_pyworkflow.egg-info → scipion_pyworkflow-3.11.2}/PKG-INFO +1 -1
  3. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_project.py +21 -4
  4. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_run_tests.py +2 -1
  5. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_sync_data.py +4 -3
  6. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/constants.py +1 -1
  7. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/browser.py +8 -0
  8. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/dialog.py +3 -1
  9. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/form.py +1 -0
  10. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/gui.py +5 -0
  11. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/base.py +2 -1
  12. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/searchprotocol.py +5 -3
  13. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprojects.py +10 -1
  14. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprotocols.py +42 -17
  15. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/text.py +4 -1
  16. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/mapper.py +4 -0
  17. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/sqlite.py +7 -5
  18. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/object.py +1 -0
  19. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/plugin.py +4 -4
  20. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/executor.py +55 -23
  21. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/hosts.py +2 -1
  22. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/protocol.py +5 -0
  23. scipion_pyworkflow-3.11.2/pyworkflow/resources/protlabels.xcf +0 -0
  24. scipion_pyworkflow-3.11.2/pyworkflow/resources/sprites.png +0 -0
  25. scipion_pyworkflow-3.11.2/pyworkflow/resources/sprites.xcf +0 -0
  26. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/template.py +1 -1
  27. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/tests/tests.py +2 -1
  28. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/process.py +2 -1
  29. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/properties.py +1 -0
  30. scipion_pyworkflow-3.11.2/pyworkflow/webservices/workflowhub.py +86 -0
  31. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2/scipion_pyworkflow.egg-info}/PKG-INFO +1 -1
  32. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/SOURCES.txt +1 -0
  33. scipion_pyworkflow-3.11.1/pyworkflow/resources/sprites.png +0 -0
  34. scipion_pyworkflow-3.11.1/pyworkflow/resources/sprites.xcf +0 -0
  35. scipion_pyworkflow-3.11.1/pyworkflow/webservices/workflowhub.py +0 -74
  36. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/LICENSE.txt +0 -0
  37. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/MANIFEST.in +0 -0
  38. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/README.rst +0 -0
  39. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyproject.toml +0 -0
  40. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/__init__.py +0 -0
  41. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/__init__.py +0 -0
  42. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_manager.py +0 -0
  43. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_plot.py +0 -0
  44. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_protocol_list.py +0 -0
  45. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_protocol_run.py +0 -0
  46. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_schedule_run.py +0 -0
  47. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_sleep.py +0 -0
  48. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_viewer.py +0 -0
  49. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/config.py +0 -0
  50. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/exceptions.py +0 -0
  51. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/__init__.py +0 -0
  52. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/canvas.py +0 -0
  53. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/graph.py +0 -0
  54. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/graph_layout.py +0 -0
  55. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/matplotlib_image.py +0 -0
  56. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/plotter.py +0 -0
  57. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/__init__.py +0 -0
  58. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/constants.py +0 -0
  59. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/labels.py +0 -0
  60. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/project.py +0 -0
  61. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/searchrun.py +0 -0
  62. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/steps.py +0 -0
  63. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/utils.py +0 -0
  64. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/variables.py +0 -0
  65. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewdata.py +0 -0
  66. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprotocols_extra.py +0 -0
  67. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/tooltip.py +0 -0
  68. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/tree.py +0 -0
  69. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/widgets.py +0 -0
  70. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/__init__.py +0 -0
  71. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/sqlite_db.py +0 -0
  72. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/__init__.py +0 -0
  73. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/config.py +0 -0
  74. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/manager.py +0 -0
  75. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/project.py +0 -0
  76. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/clean_projects.py +0 -0
  77. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/config.py +0 -0
  78. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/create.py +0 -0
  79. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/edit_workflow.py +0 -0
  80. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/fix_links.py +0 -0
  81. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/load.py +0 -0
  82. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/refresh.py +0 -0
  83. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/schedule.py +0 -0
  84. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/stack2volume.py +0 -0
  85. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/stop.py +0 -0
  86. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/usage.py +0 -0
  87. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/__init__.py +0 -0
  88. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/bibtex.py +0 -0
  89. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/constants.py +0 -0
  90. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/launch.py +0 -0
  91. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/package.py +0 -0
  92. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/params.py +0 -0
  93. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/Imagej.png +0 -0
  94. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/chimera.png +0 -0
  95. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-exclamation-triangle_alert.png +0 -0
  96. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-info-circle_alert.png +0 -0
  97. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-search.png +0 -0
  98. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-times-circle_alert.png +0 -0
  99. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/file_vol.png +0 -0
  100. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/loading.gif +0 -0
  101. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/no-image128.png +0 -0
  102. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_bn.png +0 -0
  103. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon.png +0 -0
  104. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon.svg +0 -0
  105. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon_proj.png +0 -0
  106. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon_projs.png +0 -0
  107. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon_prot.png +0 -0
  108. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_logo.png +0 -0
  109. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_logo_normal.png +0 -0
  110. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_logo_small.png +0 -0
  111. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/arrowDown.png +0 -0
  112. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/arrowUp.png +0 -0
  113. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/background_section.png +0 -0
  114. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/colRowModeOff.png +0 -0
  115. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/colRowModeOn.png +0 -0
  116. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/delete.png +0 -0
  117. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/doc_icon.png +0 -0
  118. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/download_icon.png +0 -0
  119. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/enabled_gallery.png +0 -0
  120. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/galleryViewOff.png +0 -0
  121. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/galleryViewOn.png +0 -0
  122. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/goto.png +0 -0
  123. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/menu.png +0 -0
  124. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/separator.png +0 -0
  125. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/tableViewOff.png +0 -0
  126. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/tableViewOn.png +0 -0
  127. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  128. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  129. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  130. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/volumeOff.png +0 -0
  131. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/volumeOn.png +0 -0
  132. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/wait.gif +0 -0
  133. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/tests/__init__.py +0 -0
  134. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/tests/test_utils.py +0 -0
  135. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/__init__.py +0 -0
  136. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/dataset.py +0 -0
  137. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/echo.py +0 -0
  138. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/graph.py +0 -0
  139. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/log.py +0 -0
  140. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/path.py +0 -0
  141. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/profiler.py +0 -0
  142. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/progressbar.py +0 -0
  143. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/reflection.py +0 -0
  144. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/utils.py +0 -0
  145. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/which.py +0 -0
  146. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/viewer.py +0 -0
  147. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/__init__.py +0 -0
  148. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/config.py +0 -0
  149. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/notifier.py +0 -0
  150. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/repository.py +0 -0
  151. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/wizard.py +0 -0
  152. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/__init__.py +0 -0
  153. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/bibtex.py +0 -0
  154. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/objects.py +0 -0
  155. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/protocols.py +0 -0
  156. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/__init__.py +0 -0
  157. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_canvas.py +0 -0
  158. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_domain.py +0 -0
  159. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_logs.py +0 -0
  160. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_mappers.py +0 -0
  161. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_object.py +0 -0
  162. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_project.py +0 -0
  163. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_protocol_execution.py +0 -0
  164. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_protocol_export.py +0 -0
  165. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_protocol_output.py +0 -0
  166. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_streaming.py +0 -0
  167. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_utils.py +0 -0
  168. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/requirements.txt +0 -0
  169. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/dependency_links.txt +0 -0
  170. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/entry_points.txt +0 -0
  171. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/requires.txt +0 -0
  172. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/top_level.txt +0 -0
  173. {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/setup.cfg +0 -0
@@ -1,3 +1,21 @@
1
+ V3.11.2
2
+ users:
3
+ Copy (Control-C) work in log viewers too
4
+ Pasting a copied workflow refreshes the graph
5
+ Bugfix: Protocol with very fast (almost notime) steps work instead of end up finished with pending steps.
6
+ templates can be fetched from urls having ".json" and not json.template only.
7
+ Double click in a protocol in "list mode" opens the protocol
8
+ Double click in a collapsed node, expands it.
9
+
10
+ developers:
11
+ new icon
12
+ Executor.getGpuListStr(): Returns the assigned gpus for the step as a string (accepts sep --> separator, defaults to " ")
13
+ Executor.setCudaVisibleDevices(): Sets the variable CUDA_VISIBLE_DEVICES with owned information.
14
+ Protocol.getExecutor: returns the executor. Useful to aske for gpu information inside a step
15
+ __debug__ allowed: By default Project load is with -O (optimized) so __debug__ is false.
16
+ asserts removed, swap to if + raise AssertionError
17
+ if optimized, shown in project window header
18
+
1
19
  V3.11.1 fix packaging
2
20
  V3.11.0
3
21
  users:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scipion-pyworkflow
3
- Version: 3.11.1
3
+ Version: 3.11.2
4
4
  Summary: Workflow platform used in scientific applications, initially developed within the Scipion framework for image processing in Electron Microscopy but generic by design to be applied to any domain.
5
5
  Author-email: Pablo Conesa <pconesa@cnb.csic.es>, Yunior Fonseca <cfonseca@cnb.csic.es>, "J.M. De la Rosa Trevin" <josemiguel.delarosatrevin@stjude.org>, Roberto Marabini <roberto@cnb.csic.es>, Grigory Sharov <sharov.grigory@gmail.com>, Josue Gomez Blanco <josue.gomez-blanco@mcgill.ca>
6
6
  License: GNU General Public License v3 (GPLv3)
@@ -30,8 +30,9 @@ Launch main project window
30
30
 
31
31
  import sys
32
32
  import os
33
+ from subprocess import Popen
33
34
 
34
- from pyworkflow import Config
35
+ from pyworkflow import Config, PYTHON
35
36
  from pyworkflow.project import Manager
36
37
  from pyworkflow.gui.project import ProjectWindow
37
38
  import pyworkflow.utils as pwutils
@@ -89,12 +90,28 @@ def openProject(projectName):
89
90
  projPath = manager.getProjectPath(projName)
90
91
 
91
92
  if os.path.exists(projPath):
92
- projWindow = ProjectWindow(projPath)
93
- projWindow.show()
93
+
94
+ # This opens the project in the same process as the launcher. This is good for directly debugging code
95
+ # but does not allow -O or not execution (usage of __debug__ flag).
96
+ # All we can do is to go straight to loading the project if debug is active or running optimized.
97
+ if Config.debugOn() or not __debug__:
98
+
99
+
100
+ # This may or may not be run Optimized (-O). It depends on the call to scipion last (launcher)
101
+ print("Launching project in debug or optimized...")
102
+ projWindow = ProjectWindow(projPath)
103
+ projWindow.show()
104
+ else:
105
+
106
+ # Run this same script optimized: Defined in scipion module under scipion-app: Circular definition. To fix! Bad design.
107
+ print("Launching project optimized...")
108
+ Popen([PYTHON, "-O", "-m","scipion", "project", projectName])
109
+
110
+
94
111
  else:
95
112
  print("Can't open project %s. It does not exist" % projPath)
96
113
 
97
- #Show the list of projects
114
+ # Show the list of projects
98
115
  showProjectList(manager)
99
116
 
100
117
  def showProjectList(manager):
@@ -166,7 +166,8 @@ class Tester:
166
166
  """ Show the list of tests available """
167
167
  mode = self.mode
168
168
 
169
- assert mode in ['modules', 'classes', 'onlyclasses', 'all'], 'Unknown mode %s' % mode
169
+ if mode not in ['modules', 'classes', 'onlyclasses', 'all']:
170
+ raise AssertionError('Unknown mode %s' % mode)
170
171
 
171
172
  # First flatten the list of tests.
172
173
  # testsFlat = list(iter(self.__iterTests(tests)))
@@ -278,8 +278,8 @@ def download(dataset, destination=None, url=None, verbose=False):
278
278
  urlopen('%s/%s/%s' % (url, dataset, fname)))
279
279
 
280
280
  md5 = md5sum(fpath)
281
- assert md5 == md5Remote, \
282
- "Bad md5. Expected: %s Computed: %s" % (md5Remote, md5)
281
+ if md5 != md5Remote:
282
+ raise AssertionError("Bad md5. Expected: %s Computed: %s" % (md5Remote, md5))
283
283
 
284
284
  done += inc
285
285
  if verbose:
@@ -315,7 +315,8 @@ def update(dataset, workingCopy=None, url=None, verbose=False):
315
315
  try:
316
316
  last = max(os.stat(join(datasetFolder, x)).st_mtime for x in md5sRemote)
317
317
  t_manifest = os.stat(join(datasetFolder, 'MANIFEST')).st_mtime
318
- assert t_manifest > last and time.time() - t_manifest < 60*60*24*7
318
+ if not (t_manifest > last and time.time() - t_manifest < 60*60*24*7):
319
+ raise AssertionError("Manifest times seems to be wrong.")
319
320
  except (OSError, IOError, AssertionError) as e:
320
321
  logger.info("Regenerating local MANIFEST...")
321
322
  createMANIFEST(datasetFolder)
@@ -43,7 +43,7 @@ VERSION_1 = '1.0.0'
43
43
  VERSION_1_1 = '1.1.0'
44
44
  VERSION_1_2 = '1.2.0'
45
45
  VERSION_2_0 = '2.0.0'
46
- VERSION_3_0 = '3.11.1'
46
+ VERSION_3_0 = '3.11.2'
47
47
 
48
48
  # For a new release, define a new constant and assign it to LAST_VERSION
49
49
  # The existing one has to be added to OLD_VERSIONS list.
@@ -72,6 +72,10 @@ class ObjectBrowser(tk.Frame):
72
72
  p.grid(row=0, column=0, sticky='news')
73
73
 
74
74
  leftPanel = tk.Frame(p)
75
+
76
+ # Optional, widget to get the focus
77
+ self.initial_focus=None
78
+
75
79
  self._fillLeftPanel(leftPanel)
76
80
  p.add(leftPanel, padx=5, pady=5)
77
81
  p.paneconfig(leftPanel, minsize=300)
@@ -88,6 +92,7 @@ class ObjectBrowser(tk.Frame):
88
92
  def _fillLeftPanel(self, frame):
89
93
  gui.configureWeigths(frame)
90
94
  self.tree = BoundTree(frame, self.treeProvider, style=LIST_TREEVIEW)
95
+ self.initial_focus=self.tree
91
96
  self.tree.grid(row=0, column=0, sticky='news')
92
97
  self.itemConfig = self.tree.itemConfig
93
98
  self.getImage = self.tree.getImage
@@ -489,6 +494,7 @@ class FileBrowser(ObjectBrowser):
489
494
  pathLabel.grid(row=0, column=0, padx=0, pady=3)
490
495
  pathEntry = tk.Entry(pathFrame, bg='white', width=65,
491
496
  textvariable=self.pathVar, font=gui.getDefaultFont())
497
+ self.initial_focus=pathEntry
492
498
  pathEntry.grid(row=0, column=1, sticky='new', pady=3)
493
499
  pathEntry.bind("<Return>", self._onEnterPath)
494
500
  pathEntry.bind("<KP_Enter>", self._onEnterPath)
@@ -711,6 +717,8 @@ class BrowserWindow(gui.Window):
711
717
  browser.grid(row=row, column=column, sticky='news')
712
718
  self.itemConfig = browser.tree.itemConfig
713
719
 
720
+ if browser.initial_focus is not None:
721
+ self.initial_focus = browser.initial_focus
714
722
 
715
723
  STANDARD_IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg']
716
724
 
@@ -644,7 +644,7 @@ class ListDialog(Dialog):
644
644
  label = tk.Label(bodyFrame, text=self.message, compound=tk.LEFT,
645
645
  image=self.getImage(Icon.LIGHTBULB))
646
646
  label.grid(row=2, column=0, sticky='nw', padx=5, pady=5)
647
- self.initial_focus = self.tree
647
+ # CAncel this, now focus is set to the search box. self.initial_focus = self.tree
648
648
 
649
649
  def _createTree(self, parent):
650
650
  self.tree = BoundTree(parent, self.provider, selectmode=self._selectmode, style=LIST_TREEVIEW)
@@ -677,6 +677,7 @@ class ListDialog(Dialog):
677
677
  self.entry.bind('<KeyRelease>', self._onSearch)
678
678
  self.entry.focus_set()
679
679
  self.entry.grid(row=0, column=1, sticky='news')
680
+ self.initial_focus=self.entry
680
681
  self.searchBoxframe.grid(row=0, column=0, sticky='news', padx=5,
681
682
  pady=(10, 5))
682
683
 
@@ -910,6 +911,7 @@ class SearchBaseWindow(Window):
910
911
  entry.bind(TK.ENTER, self._onSearchClick)
911
912
  entry.focus_set()
912
913
  entry.grid(row=0, column=1, sticky='nw')
914
+ self.initial_focus=entry
913
915
  btn = widgets.IconButton(frame, "Search",
914
916
  imagePath=Icon.ACTION_SEARCH,
915
917
  command=self._onSearchClick)
@@ -1937,6 +1937,7 @@ class FormWindow(Window):
1937
1937
  self.waitForVar.set(', '.join(self.protocol.getPrerequisites()))
1938
1938
  entryWf = tk.Entry(runFrame, font=self.font, width=25,
1939
1939
  textvariable=self.waitForVar)
1940
+ self.initial_focus = entryWf
1940
1941
  entryWf.grid(row=r, column=c + 1, padx=(0, 5), pady=5, sticky='ew')
1941
1942
 
1942
1943
  self.waitForVar.trace('w', self._setWaitFor)
@@ -371,6 +371,8 @@ class Window:
371
371
  self.master = masterWindow
372
372
  setCommonFonts(self)
373
373
 
374
+ self.initial_focus = None
375
+
374
376
  if kwargs.get('enableQueue', False):
375
377
  self.queue = queue.Queue(maxsize=0)
376
378
  else:
@@ -451,6 +453,9 @@ class Window:
451
453
  if self.queue is not None:
452
454
  self._queueTimer = self.root.after(1000, self.__processQueue)
453
455
 
456
+ if self.initial_focus is not None:
457
+ self.initial_focus.focus_set()
458
+
454
459
  if modal:
455
460
  self.root.wait_window(self.root)
456
461
  else:
@@ -92,7 +92,8 @@ class ProjectBaseWindow(Window):
92
92
  logoLabel = tk.Label(header, image=logoImg,
93
93
  borderwidth=0, anchor='nw', bg=pw.Config.SCIPION_BG_COLOR)
94
94
  logoLabel.grid(row=0, column=0, sticky='nw', padx=(5, 0), pady=5)
95
- version = "%s - %s (core)" % (os.environ.get('SCIPION_VERSION', ""), pw.LAST_VERSION)
95
+
96
+ version = "%s - %s (core%s)" % (os.environ.get('SCIPION_VERSION', ""), pw.LAST_VERSION, ' optimized'if not __debug__ else '')
96
97
 
97
98
  versionLabel = tk.Label(header, text=version,
98
99
  bg=pw.Config.SCIPION_BG_COLOR)
@@ -24,6 +24,8 @@
24
24
  # **************************************************************************
25
25
  """ This module contains the provider and dialog to search for a protocol"""
26
26
  import tkinter as tk
27
+ import logging
28
+ logger = logging.getLogger(__name__)
27
29
  from pyworkflow import Config
28
30
  import pyworkflow.gui as pwgui
29
31
  import pyworkflow.object as pwobj
@@ -35,12 +37,9 @@ from pyworkflow.project.usage import getNextProtocolSuggestions
35
37
  from pyworkflow.utils import Icon
36
38
 
37
39
  UPDATED = "updated"
38
-
39
40
  NEW = "new"
40
-
41
41
  BETA = "beta"
42
42
 
43
-
44
43
  class ProtocolTreeProvider(pwgui.tree.ObjectTreeProvider):
45
44
  """Create the tree elements for a Protocol run"""
46
45
 
@@ -81,6 +80,7 @@ class SearchProtocolWindow(SearchBaseWindow):
81
80
  title="Add a protocol" + posStr)
82
81
 
83
82
  self.root.bind("<FocusIn>", self._onWindowFocusIn)
83
+ self.root.focus()
84
84
 
85
85
  def _onWindowFocusIn(self, event):
86
86
  """
@@ -92,6 +92,8 @@ class SearchProtocolWindow(SearchBaseWindow):
92
92
  self.selectedProtocol = self.selectionGetter()
93
93
  if self._isSuggestionActive():
94
94
  self._onSearchClick()
95
+ self.initial_focus.focus_set()
96
+
95
97
  def _isSuggestionActive(self):
96
98
  """
97
99
  :return: Returns true if current mode is suggestion mode.
@@ -220,7 +220,16 @@ class ProjectsView(tk.Frame):
220
220
  def openProject(self, projName):
221
221
  from subprocess import Popen
222
222
  script = pw.join(pw.APPS, 'pw_project.py')
223
- Popen([pw.PYTHON, script, projName])
223
+ args=[pw.PYTHON, "-O", script, projName]
224
+
225
+ # Launcher is the ona calling this process. Since launcher does not deal
226
+ # with __debug__ we should use the variable in the config
227
+ if pw.Config.debugOn():
228
+ # If not optimizing code, remove -O
229
+ logger.warning(f"Launching project {projName} in debug mode.")
230
+ del args[1]
231
+
232
+ Popen(args)
224
233
 
225
234
  def deleteProject(self, projInfo):
226
235
 
@@ -85,10 +85,23 @@ class ProtocolsView(tk.Frame):
85
85
  SIZE_1GB: "orange",
86
86
  SIZE_1TB: "red"}
87
87
 
88
+ _actionList = [
89
+ ACTION_NEW, ACTION_EDIT, ACTION_RENAME, ACTION_DUPLICATE, ACTION_COPY, ACTION_PASTE, ACTION_DELETE,
90
+ ACTION_BROWSE,
91
+ ACTION_STOP, ACTION_STOP_WORKFLOW, ACTION_CONTINUE, ACTION_CONTINUE_WORKFLOW, ACTION_RESTART_WORKFLOW,
92
+ ACTION_RESET_WORKFLOW,
93
+ ACTION_RESULTS,
94
+ ACTION_EXPORT, ACTION_EXPORT_UPLOAD,
95
+ ACTION_COLLAPSE, ACTION_EXPAND,
96
+ ACTION_LABELS, ACTION_SEARCH,
97
+ ACTION_SELECT_FROM, ACTION_SELECT_TO,
98
+ ACTION_STEPS, ACTION_DB
99
+ ]
88
100
  _protocolViews = None
89
101
 
90
102
  def __init__(self, parent, window, **args):
91
103
  tk.Frame.__init__(self, parent, **args)
104
+
92
105
  # Load global configuration
93
106
  self.window = window
94
107
  self.project = window.project
@@ -110,6 +123,8 @@ class ProtocolsView(tk.Frame):
110
123
  self.root.bind("<Control-t>", self._toggleColorScheme)
111
124
  self.root.bind("<Control-D>", self._toggleDebug)
112
125
  self.root.bind("<Control-l>", self._locateProtocol)
126
+ # Bind to root "focus in"
127
+ self.root.bind("<FocusIn>", self._onWindowFocusIn)
113
128
 
114
129
  if Config.debugOn():
115
130
  self.root.bind("<Control-i>", self._inspectProtocols)
@@ -295,6 +310,11 @@ class ProtocolsView(tk.Frame):
295
310
 
296
311
  return p
297
312
 
313
+ def _onWindowFocusIn(self, event):
314
+ """ Refresh on windows get focus """
315
+ if event.widget == self.root:
316
+ self.runsGraphCanvas.focus_set()
317
+
298
318
  def _viewObject(self, objId):
299
319
  """ Call appropriate viewer for objId. """
300
320
  proj = self.project
@@ -442,17 +462,6 @@ class ProtocolsView(tk.Frame):
442
462
  """ Prepare the buttons that will be available for protocol actions. """
443
463
 
444
464
  self.actionButtons = {}
445
- actionList = [
446
- ACTION_NEW, ACTION_EDIT, ACTION_RENAME, ACTION_DUPLICATE, ACTION_COPY, ACTION_PASTE, ACTION_DELETE,
447
- ACTION_BROWSE,
448
- ACTION_STOP, ACTION_STOP_WORKFLOW, ACTION_CONTINUE, ACTION_CONTINUE_WORKFLOW, ACTION_RESTART_WORKFLOW, ACTION_RESET_WORKFLOW,
449
- ACTION_RESULTS,
450
- ACTION_EXPORT, ACTION_EXPORT_UPLOAD,
451
- ACTION_COLLAPSE, ACTION_EXPAND,
452
- ACTION_LABELS, ACTION_SEARCH,
453
- ACTION_SELECT_FROM, ACTION_SELECT_TO,
454
- ACTION_STEPS, ACTION_DB
455
- ]
456
465
 
457
466
  def addButton(action, text, toolbar):
458
467
 
@@ -464,17 +473,16 @@ class ProtocolsView(tk.Frame):
464
473
  callback = lambda e: self._runActionClicked(action, event=e)
465
474
  btn.bind(TK.LEFT_CLICK, callback)
466
475
 
467
- # Shortcuts:
476
+ # Shortcuts, these are bind later!!
468
477
  shortCut = ActionShortCuts.get(action, None)
469
478
  if shortCut:
470
479
  text += " (%s)" % shortCut
471
- self.root.bind(shortCut, callback)
472
480
 
473
481
  ToolTip(btn, text, 500)
474
482
 
475
483
  return btn
476
484
 
477
- for action in actionList:
485
+ for action in self._actionList:
478
486
  self.actionButtons[action] = addButton(action, action,
479
487
  self.runsToolbar)
480
488
 
@@ -745,6 +753,17 @@ class ProtocolsView(tk.Frame):
745
753
 
746
754
  self.updateRunsGraph()
747
755
 
756
+ # Shortcuts for actions
757
+ for action in self._actionList:
758
+
759
+ # prevent "late binding closure" by passing action as a default value for the lambda param.
760
+ callback = lambda e, my_action=action: self._runActionClicked(my_action, event=e)
761
+
762
+ # Shortcuts:
763
+ shortCut = ActionShortCuts.get(action, None)
764
+ if shortCut:
765
+ self.runsGraphCanvas.bind(shortCut, callback)
766
+
748
767
  def updateRunsGraph(self, refresh=False, checkPids=False, position=None):
749
768
 
750
769
  self.runsGraph = self.project.getRunsGraph(refresh=refresh,
@@ -1215,9 +1234,15 @@ class ProtocolsView(tk.Frame):
1215
1234
  self._selectItemProtocol(prot)
1216
1235
 
1217
1236
  def _runItemDoubleClick(self, item=None, e=None):
1218
- if item.nodeInfo.isExpanded():
1237
+
1238
+ if self.runsView == VIEW_LIST:
1219
1239
  self._runActionClicked(ACTION_EDIT)
1220
1240
 
1241
+ elif item.nodeInfo.isExpanded():
1242
+ self._runActionClicked(ACTION_EDIT)
1243
+ else:
1244
+ self._runActionClicked(ACTION_EXPAND)
1245
+
1221
1246
  def _runItemMiddleClick(self, e=None):
1222
1247
  self._runActionClicked(ACTION_SELECT_TO)
1223
1248
 
@@ -1612,7 +1637,7 @@ class ProtocolsView(tk.Frame):
1612
1637
 
1613
1638
  self.project.loadProtocols(jsonStr=self.clipboard_get())
1614
1639
  self.info("Clipboard content pasted successfully.")
1615
- self.updateRunsGraph(False)
1640
+ self.updateRunsGraph(True)
1616
1641
  except Exception as e:
1617
1642
  self.info("Paste failed, maybe clipboard content is not valid content? See GUI log for details.")
1618
1643
  logger.error("Clipboard content couldn't be pasted." , exc_info=e)
@@ -1988,7 +2013,7 @@ class ProtocolsView(tk.Frame):
1988
2013
  if event is not None:
1989
2014
  # log Search box events are reaching here
1990
2015
  # Since this method is bound to the window events
1991
- if event.widget.widgetName == 'entry':
2016
+ if event.widget.widgetName in ['text', 'entry']:
1992
2017
  return
1993
2018
 
1994
2019
  # Following actions do not need a select run
@@ -170,6 +170,7 @@ class Text(tk.Text, Scrollable):
170
170
  # Associate with right click
171
171
  self.bind("<Button-1>", self.onClick)
172
172
  self.bind("<Button-3>", self.onRightClick)
173
+ self.bind("Control-c", self.copyToClipboard)
173
174
 
174
175
  def getDefaults(self):
175
176
  """This should be implemented in subclasses to provide defaults"""
@@ -234,6 +235,7 @@ class Text(tk.Text, Scrollable):
234
235
  def copyToClipboard(self, e=None):
235
236
  self.clipboard_clear()
236
237
  self.clipboard_append(self.selection)
238
+ return "break"
237
239
 
238
240
  def openFile(self):
239
241
  # What happens when you right-click and select "Open path"
@@ -508,7 +510,7 @@ class TextFileViewer(tk.Frame):
508
510
  self.maxSize = maxSize
509
511
  self.width = width
510
512
  self.height = height
511
-
513
+ self.searchEntry = None
512
514
  self.createWidgets(fileList)
513
515
  self.master = master
514
516
  self.addBinding()
@@ -755,6 +757,7 @@ def openTextFileEditor(filename, tkParent=None):
755
757
  def showTextFileViewer(title, filelist, parent=None, main=False):
756
758
  w = gui.Window(title, parent, minsize=(600, 400))
757
759
  viewer = TextFileViewer(w.root, filelist, maxSize=-1, font=w.font)
760
+ w.initial_focus=viewer.searchEntry
758
761
  viewer.grid(row=0, column=0, sticky='news')
759
762
  gui.configureWeigths(w.root)
760
763
  w.show()
@@ -84,6 +84,10 @@ class Mapper:
84
84
 
85
85
  try:
86
86
  instance = self.dictClasses[className]()
87
+
88
+ if __debug__:
89
+ logger.debug("Object instantiated of class %s", className)
90
+
87
91
  except Exception as e:
88
92
  clazz = self.dictClasses._default
89
93
  logger.error('Class %s could not be created. Replacing it with %s ' % (className, clazz.__name__), exc_info=e)
@@ -187,6 +187,10 @@ class SqliteMapper(Mapper):
187
187
  """Build the object which id is objId"""
188
188
  if objId in self.objDict:
189
189
  obj = self.objDict[objId]
190
+
191
+ if __debug__:
192
+ # If not optimized code
193
+ logger.debug("Object with id %s already loaded: %s", objId, obj)
190
194
  else:
191
195
  objRow = self.db.selectObjectById(objId)
192
196
  if objRow is None:
@@ -211,10 +215,8 @@ class SqliteMapper(Mapper):
211
215
  rowName = self._getStrValue(objRow['name'])
212
216
 
213
217
  if not hasattr(obj, ID_ATTRIBUTE):
214
- raise Exception("Entry '%s' (id=%s) in the database, stored as '%s'"
215
- ", is being mapped to %s object. " %
216
- (rowName, rowId,
217
- objRow['classname'], type(obj)))
218
+ raise Exception(f"Entry '{rowName}' (id={rowId}) in the database, stored as '{objRow['classname']}'"
219
+ f", is being mapped to {type(obj)} object.")
218
220
 
219
221
  obj._objId = rowId
220
222
 
@@ -880,7 +882,7 @@ class SqliteFlatMapper(Mapper):
880
882
  self.db.deleteAll()
881
883
 
882
884
  def delete(self, obj):
883
- """Delete an object and all its childs"""
885
+ """Delete an object and all its children"""
884
886
  self.db.deleteObject(obj.getObjId())
885
887
 
886
888
  def updateTo(self, obj, level=1):
@@ -1344,6 +1344,7 @@ class Set(Object):
1344
1344
  else:
1345
1345
  self._idCount = max(self._idCount, item.getObjId())
1346
1346
  self._insertItem(item)
1347
+ # FIXME: Incrementing always!! When updating this is wrong.
1347
1348
  self._size.increment()
1348
1349
 
1349
1350
  def _insertItem(self, item):
@@ -410,11 +410,11 @@ class Domain:
410
410
  viewerClassName,
411
411
  doRaise=True)
412
412
  viewers.append(prefViewer)
413
- except Exception as e:
414
- logger.error("Couldn't load \"%s\" as preferred viewer for %s.\n"
413
+ except Exception:
414
+ logger.info("Couldn't load \"%s\" as preferred viewer for %s.\n"
415
415
  "There might be a typo in your VIEWERS variable "
416
- "or an error in the viewer's plugin installation"
417
- % (prefViewerStr, className), exc_info=e)
416
+ "or an error in the viewer's plugin installation or simply the plugin is not installed."
417
+ % (prefViewerStr, target))
418
418
 
419
419
  cls._preferred_viewers[target] = viewers
420
420