qtextra 0.1.4__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 (170) hide show
  1. qtextra-0.1.4/.gitignore +111 -0
  2. qtextra-0.1.4/LICENSE +29 -0
  3. qtextra-0.1.4/PKG-INFO +122 -0
  4. qtextra-0.1.4/README.md +46 -0
  5. qtextra-0.1.4/pyproject.toml +236 -0
  6. qtextra-0.1.4/src/qtextra/__init__.py +10 -0
  7. qtextra-0.1.4/src/qtextra/_pydantic_compat.py +115 -0
  8. qtextra-0.1.4/src/qtextra/assets/__init__.py +343 -0
  9. qtextra-0.1.4/src/qtextra/assets/gifs/loading-circle.gif +0 -0
  10. qtextra-0.1.4/src/qtextra/assets/gifs/loading-dots.gif +0 -0
  11. qtextra-0.1.4/src/qtextra/assets/gifs/loading-infinity.gif +0 -0
  12. qtextra-0.1.4/src/qtextra/assets/gifs/loading-oval.gif +0 -0
  13. qtextra-0.1.4/src/qtextra/assets/gifs/loading-square.gif +0 -0
  14. qtextra-0.1.4/src/qtextra/assets/icons/2d.svg +7 -0
  15. qtextra-0.1.4/src/qtextra/assets/icons/check.svg +7 -0
  16. qtextra-0.1.4/src/qtextra/assets/icons/cross.svg +7 -0
  17. qtextra-0.1.4/src/qtextra/assets/icons/down_arrow.svg +6 -0
  18. qtextra-0.1.4/src/qtextra/assets/icons/drop_down.svg +6 -0
  19. qtextra-0.1.4/src/qtextra/assets/icons/horizontal_separator.svg +15 -0
  20. qtextra-0.1.4/src/qtextra/assets/icons/left_arrow.svg +6 -0
  21. qtextra-0.1.4/src/qtextra/assets/icons/minus.svg +6 -0
  22. qtextra-0.1.4/src/qtextra/assets/icons/path.svg +446 -0
  23. qtextra-0.1.4/src/qtextra/assets/icons/plus.svg +11 -0
  24. qtextra-0.1.4/src/qtextra/assets/icons/right_arrow.svg +6 -0
  25. qtextra-0.1.4/src/qtextra/assets/icons/transpose.svg +12 -0
  26. qtextra-0.1.4/src/qtextra/assets/icons/up_arrow.svg +6 -0
  27. qtextra-0.1.4/src/qtextra/assets/icons/vertical_separator.svg +15 -0
  28. qtextra-0.1.4/src/qtextra/assets/loading-infinity.gif +0 -0
  29. qtextra-0.1.4/src/qtextra/assets/loading-oval.gif +0 -0
  30. qtextra-0.1.4/src/qtextra/assets/stylesheets/00_base.qss +794 -0
  31. qtextra-0.1.4/src/qtextra/assets/stylesheets/01_buttons.qss +193 -0
  32. qtextra-0.1.4/src/qtextra/assets/stylesheets/01_labels.qss +20 -0
  33. qtextra-0.1.4/src/qtextra/assets/stylesheets/02_icons.qss +11 -0
  34. qtextra-0.1.4/src/qtextra/assets/stylesheets/03_qta.qss +59 -0
  35. qtextra-0.1.4/src/qtextra/assets/stylesheets/04_custom.qss +600 -0
  36. qtextra-0.1.4/src/qtextra/assets/stylesheets/04_toast.qss +74 -0
  37. qtextra-0.1.4/src/qtextra/assets/stylesheets/04_tutorial.qss +13 -0
  38. qtextra-0.1.4/src/qtextra/assets/stylesheets/07_queue.qss +140 -0
  39. qtextra-0.1.4/src/qtextra/config/__init__.py +12 -0
  40. qtextra-0.1.4/src/qtextra/config/config.py +164 -0
  41. qtextra-0.1.4/src/qtextra/config/events.py +52 -0
  42. qtextra-0.1.4/src/qtextra/config/theme.py +822 -0
  43. qtextra-0.1.4/src/qtextra/custom/__init__.py +0 -0
  44. qtextra-0.1.4/src/qtextra/custom/qt_directory_manager.py +269 -0
  45. qtextra-0.1.4/src/qtextra/dialogs/__init__.py +0 -0
  46. qtextra-0.1.4/src/qtextra/dialogs/qt_changelog.py +185 -0
  47. qtextra-0.1.4/src/qtextra/dialogs/qt_close_window.py +97 -0
  48. qtextra-0.1.4/src/qtextra/dialogs/qt_color_dialog.py +156 -0
  49. qtextra-0.1.4/src/qtextra/dialogs/qt_confirm.py +48 -0
  50. qtextra-0.1.4/src/qtextra/dialogs/qt_console.py +193 -0
  51. qtextra-0.1.4/src/qtextra/dialogs/qt_dev.py +41 -0
  52. qtextra-0.1.4/src/qtextra/dialogs/qt_info.py +85 -0
  53. qtextra-0.1.4/src/qtextra/dialogs/qt_info_popup.py +30 -0
  54. qtextra-0.1.4/src/qtextra/dialogs/qt_logger.py +220 -0
  55. qtextra-0.1.4/src/qtextra/dialogs/qt_sysinfo.py +127 -0
  56. qtextra-0.1.4/src/qtextra/dialogs/qt_text_replace.py +177 -0
  57. qtextra-0.1.4/src/qtextra/dialogs/qt_theme_sample.py +174 -0
  58. qtextra-0.1.4/src/qtextra/dialogs/sentry/__init__.py +132 -0
  59. qtextra-0.1.4/src/qtextra/dialogs/sentry/feedback.py +122 -0
  60. qtextra-0.1.4/src/qtextra/dialogs/sentry/telemetry.py +119 -0
  61. qtextra-0.1.4/src/qtextra/dialogs/sentry/utilities.py +235 -0
  62. qtextra-0.1.4/src/qtextra/event_loop.py +232 -0
  63. qtextra-0.1.4/src/qtextra/helpers.py +3445 -0
  64. qtextra-0.1.4/src/qtextra/icons.py +158 -0
  65. qtextra-0.1.4/src/qtextra/mixins.py +237 -0
  66. qtextra-0.1.4/src/qtextra/py.typed +0 -0
  67. qtextra-0.1.4/src/qtextra/queue/__init__.py +1 -0
  68. qtextra-0.1.4/src/qtextra/queue/cli_qprocess.py +412 -0
  69. qtextra-0.1.4/src/qtextra/queue/cli_queue.py +441 -0
  70. qtextra-0.1.4/src/qtextra/queue/info.py +295 -0
  71. qtextra-0.1.4/src/qtextra/queue/item.py +377 -0
  72. qtextra-0.1.4/src/qtextra/queue/popup.py +65 -0
  73. qtextra-0.1.4/src/qtextra/queue/queue_widget.py +341 -0
  74. qtextra-0.1.4/src/qtextra/queue/task.py +126 -0
  75. qtextra-0.1.4/src/qtextra/queue/utilities.py +145 -0
  76. qtextra-0.1.4/src/qtextra/typing.py +32 -0
  77. qtextra-0.1.4/src/qtextra/utils/__init__.py +0 -0
  78. qtextra-0.1.4/src/qtextra/utils/appdirs.py +19 -0
  79. qtextra-0.1.4/src/qtextra/utils/color.py +56 -0
  80. qtextra-0.1.4/src/qtextra/utils/context.py +64 -0
  81. qtextra-0.1.4/src/qtextra/utils/dev.py +245 -0
  82. qtextra-0.1.4/src/qtextra/utils/enums.py +0 -0
  83. qtextra-0.1.4/src/qtextra/utils/format.py +26 -0
  84. qtextra-0.1.4/src/qtextra/utils/notifications.py +364 -0
  85. qtextra-0.1.4/src/qtextra/utils/progress.py +119 -0
  86. qtextra-0.1.4/src/qtextra/utils/qt.py +117 -0
  87. qtextra-0.1.4/src/qtextra/utils/table_config.py +153 -0
  88. qtextra-0.1.4/src/qtextra/utils/template.py +159 -0
  89. qtextra-0.1.4/src/qtextra/utils/utilities.py +176 -0
  90. qtextra-0.1.4/src/qtextra/utils/wrap.py +163 -0
  91. qtextra-0.1.4/src/qtextra/widgets/__init__.py +1 -0
  92. qtextra-0.1.4/src/qtextra/widgets/_qt_graphics.py +37 -0
  93. qtextra-0.1.4/src/qtextra/widgets/_qt_mixins.py +448 -0
  94. qtextra-0.1.4/src/qtextra/widgets/_qta_mixin.py +203 -0
  95. qtextra-0.1.4/src/qtextra/widgets/qt_action.py +33 -0
  96. qtextra-0.1.4/src/qtextra/widgets/qt_active_overlay.py +130 -0
  97. qtextra-0.1.4/src/qtextra/widgets/qt_animation.py +317 -0
  98. qtextra-0.1.4/src/qtextra/widgets/qt_button.py +180 -0
  99. qtextra-0.1.4/src/qtextra/widgets/qt_button_clipboard.py +54 -0
  100. qtextra-0.1.4/src/qtextra/widgets/qt_button_color.py +239 -0
  101. qtextra-0.1.4/src/qtextra/widgets/qt_button_icon.py +851 -0
  102. qtextra-0.1.4/src/qtextra/widgets/qt_button_progress.py +116 -0
  103. qtextra-0.1.4/src/qtextra/widgets/qt_button_tag.py +431 -0
  104. qtextra-0.1.4/src/qtextra/widgets/qt_button_tool.py +81 -0
  105. qtextra-0.1.4/src/qtextra/widgets/qt_checkbox.py +16 -0
  106. qtextra-0.1.4/src/qtextra/widgets/qt_code_widget.py +86 -0
  107. qtextra-0.1.4/src/qtextra/widgets/qt_collapsible.py +130 -0
  108. qtextra-0.1.4/src/qtextra/widgets/qt_combobox_check.py +104 -0
  109. qtextra-0.1.4/src/qtextra/widgets/qt_combobox_elide.py +46 -0
  110. qtextra-0.1.4/src/qtextra/widgets/qt_combobox_search.py +67 -0
  111. qtextra-0.1.4/src/qtextra/widgets/qt_dialog.py +843 -0
  112. qtextra-0.1.4/src/qtextra/widgets/qt_dock_widget.py +190 -0
  113. qtextra-0.1.4/src/qtextra/widgets/qt_drag.py +79 -0
  114. qtextra-0.1.4/src/qtextra/widgets/qt_filter_edit.py +154 -0
  115. qtextra-0.1.4/src/qtextra/widgets/qt_histogram.py +451 -0
  116. qtextra-0.1.4/src/qtextra/widgets/qt_html_browser.py +38 -0
  117. qtextra-0.1.4/src/qtextra/widgets/qt_label.py +19 -0
  118. qtextra-0.1.4/src/qtextra/widgets/qt_label_click.py +155 -0
  119. qtextra-0.1.4/src/qtextra/widgets/qt_label_elide.py +49 -0
  120. qtextra-0.1.4/src/qtextra/widgets/qt_label_icon.py +261 -0
  121. qtextra-0.1.4/src/qtextra/widgets/qt_label_image.py +439 -0
  122. qtextra-0.1.4/src/qtextra/widgets/qt_label_read_more.py +89 -0
  123. qtextra-0.1.4/src/qtextra/widgets/qt_label_scroll.py +78 -0
  124. qtextra-0.1.4/src/qtextra/widgets/qt_label_vertical.py +49 -0
  125. qtextra-0.1.4/src/qtextra/widgets/qt_layout_expand.py +127 -0
  126. qtextra-0.1.4/src/qtextra/widgets/qt_layout_flow.py +328 -0
  127. qtextra-0.1.4/src/qtextra/widgets/qt_layout_scroll.py +162 -0
  128. qtextra-0.1.4/src/qtextra/widgets/qt_line_edit.py +228 -0
  129. qtextra-0.1.4/src/qtextra/widgets/qt_list_select.py +279 -0
  130. qtextra-0.1.4/src/qtextra/widgets/qt_list_widget.py +353 -0
  131. qtextra-0.1.4/src/qtextra/widgets/qt_message.py +38 -0
  132. qtextra-0.1.4/src/qtextra/widgets/qt_notification.py +557 -0
  133. qtextra-0.1.4/src/qtextra/widgets/qt_overlay.py +419 -0
  134. qtextra-0.1.4/src/qtextra/widgets/qt_popout.py +563 -0
  135. qtextra-0.1.4/src/qtextra/widgets/qt_progress_bar.py +165 -0
  136. qtextra-0.1.4/src/qtextra/widgets/qt_progress_eta.py +126 -0
  137. qtextra-0.1.4/src/qtextra/widgets/qt_progress_step.py +166 -0
  138. qtextra-0.1.4/src/qtextra/widgets/qt_pulse.py +142 -0
  139. qtextra-0.1.4/src/qtextra/widgets/qt_select_multi.py +381 -0
  140. qtextra-0.1.4/src/qtextra/widgets/qt_select_one.py +132 -0
  141. qtextra-0.1.4/src/qtextra/widgets/qt_separator.py +90 -0
  142. qtextra-0.1.4/src/qtextra/widgets/qt_splash_screen.py +52 -0
  143. qtextra-0.1.4/src/qtextra/widgets/qt_stacked_widget.py +212 -0
  144. qtextra-0.1.4/src/qtextra/widgets/qt_status.py +338 -0
  145. qtextra-0.1.4/src/qtextra/widgets/qt_svg.py +148 -0
  146. qtextra-0.1.4/src/qtextra/widgets/qt_system_summary.py +271 -0
  147. qtextra-0.1.4/src/qtextra/widgets/qt_system_tray_icon.py +18 -0
  148. qtextra-0.1.4/src/qtextra/widgets/qt_table_view_array.py +302 -0
  149. qtextra-0.1.4/src/qtextra/widgets/qt_table_view_check.py +1167 -0
  150. qtextra-0.1.4/src/qtextra/widgets/qt_table_view_dataframe.py +874 -0
  151. qtextra-0.1.4/src/qtextra/widgets/qt_tile.py +127 -0
  152. qtextra-0.1.4/src/qtextra/widgets/qt_toast.py +181 -0
  153. qtextra-0.1.4/src/qtextra/widgets/qt_toast_info.py +649 -0
  154. qtextra-0.1.4/src/qtextra/widgets/qt_toggle_group.py +157 -0
  155. qtextra-0.1.4/src/qtextra/widgets/qt_toolbar_mini.py +271 -0
  156. qtextra-0.1.4/src/qtextra/widgets/qt_toolbar_panel.py +425 -0
  157. qtextra-0.1.4/src/qtextra/widgets/qt_tooltip.py +715 -0
  158. qtextra-0.1.4/src/qtextra/widgets/qt_tutorial.py +361 -0
  159. qtextra-0.1.4/tests/__init__.py +48 -0
  160. qtextra-0.1.4/tests/conftest.py +20 -0
  161. qtextra-0.1.4/tests/dialogs/test_qt_console.py +40 -0
  162. qtextra-0.1.4/tests/dialogs/test_qt_logger.py +42 -0
  163. qtextra-0.1.4/tests/test_queue.py +142 -0
  164. qtextra-0.1.4/tests/test_theme.py +40 -0
  165. qtextra-0.1.4/tests/widgets/__init__.py +0 -0
  166. qtextra-0.1.4/tests/widgets/test_qt_button.py +25 -0
  167. qtextra-0.1.4/tests/widgets/test_qt_color_button.py +42 -0
  168. qtextra-0.1.4/tests/widgets/test_qt_image_button.py +42 -0
  169. qtextra-0.1.4/tests/widgets/test_qt_table_view.py +39 -0
  170. qtextra-0.1.4/tests/widgets/test_qt_tool_button.py +67 -0
@@ -0,0 +1,111 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ env/
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+
28
+ # PyInstaller
29
+ # Usually these files are written by a python script from a template
30
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .coverage
42
+ .coverage.*
43
+ .cache
44
+ nosetests.xml
45
+ coverage.xml
46
+ *.cover
47
+ .hypothesis/
48
+ .pytest_cache/
49
+
50
+ # Translations
51
+ *.mo
52
+ *.pot
53
+
54
+ # Django stuff:
55
+ *.log
56
+ local_settings.py
57
+
58
+ # Flask stuff:
59
+ instance/
60
+ .webassets-cache
61
+
62
+ # Scrapy stuff:
63
+ .scrapy
64
+
65
+ # Sphinx documentation
66
+ docs/_build/
67
+
68
+ # PyBuilder
69
+ target/
70
+
71
+ # Jupyter Notebook
72
+ .ipynb_checkpoints
73
+
74
+ # pyenv
75
+ .python-version
76
+
77
+ # celery beat schedule file
78
+ celerybeat-schedule
79
+
80
+ # SageMath parsed files
81
+ *.sage.py
82
+
83
+ # dotenv
84
+ .env
85
+
86
+ # virtualenv
87
+ .venv
88
+ venv/
89
+ ENV/
90
+
91
+ # Spyder project settings
92
+ .spyderproject
93
+ .spyproject
94
+
95
+ # Rope project settings
96
+ .ropeproject
97
+
98
+ # mkdocs documentation
99
+ /site
100
+
101
+ # mypy
102
+ .mypy_cache/
103
+
104
+ # IDE settings
105
+ .vscode/
106
+
107
+ _version.py
108
+ *.iml
109
+ .idea/
110
+
111
+ docs/_auto_images/
qtextra-0.1.4/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD License
2
+
3
+ Copyright (c) 2023, Lukasz G. Migas
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
qtextra-0.1.4/PKG-INFO ADDED
@@ -0,0 +1,122 @@
1
+ Metadata-Version: 2.4
2
+ Name: qtextra
3
+ Version: 0.1.4
4
+ Summary: Extra widgets for Qt
5
+ Project-URL: homepage, https://github.com/illumion-io/qtextra
6
+ Project-URL: repository, https://github.com/illumion-io/qtextra
7
+ Author-email: "Lukasz G. Migas" <lukas.migas@yahoo.com>
8
+ License: BSD 3-Clause License
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: License :: OSI Approved :: BSD License
12
+ Classifier: Natural Language :: English
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Typing :: Typed
18
+ Requires-Python: >=3.8
19
+ Requires-Dist: appdirs
20
+ Requires-Dist: koyo
21
+ Requires-Dist: numpy
22
+ Requires-Dist: psygnal
23
+ Requires-Dist: pydantic-extra-types
24
+ Requires-Dist: pydantic>2
25
+ Requires-Dist: qtawesome
26
+ Requires-Dist: qtpy
27
+ Requires-Dist: superqt>=0.7.1
28
+ Provides-Extra: all
29
+ Requires-Dist: console; extra == 'all'
30
+ Requires-Dist: pyqt6; extra == 'all'
31
+ Requires-Dist: sentry; extra == 'all'
32
+ Provides-Extra: console
33
+ Requires-Dist: ipykernel>=5.2.0; extra == 'console'
34
+ Requires-Dist: qtconsole!=4.7.6,!=5.4.2,>=4.5.1; extra == 'console'
35
+ Provides-Extra: dev
36
+ Requires-Dist: check-manifest; extra == 'dev'
37
+ Requires-Dist: ipython; extra == 'dev'
38
+ Requires-Dist: mypy; extra == 'dev'
39
+ Requires-Dist: pdbpp; extra == 'dev'
40
+ Requires-Dist: pre-commit; extra == 'dev'
41
+ Requires-Dist: pytest-cov; extra == 'dev'
42
+ Requires-Dist: pytest-pretty; extra == 'dev'
43
+ Requires-Dist: pytest-qt; extra == 'dev'
44
+ Requires-Dist: pytest>=8.1; extra == 'dev'
45
+ Requires-Dist: qtreload; extra == 'dev'
46
+ Requires-Dist: rich; extra == 'dev'
47
+ Requires-Dist: ruff; extra == 'dev'
48
+ Provides-Extra: docs
49
+ Requires-Dist: ipykernel>=5.2.0; extra == 'docs'
50
+ Requires-Dist: mkdocs-macros-plugin==1.3.7; extra == 'docs'
51
+ Requires-Dist: mkdocs-material==9.6.12; extra == 'docs'
52
+ Requires-Dist: mkdocstrings-python==1.16.10; extra == 'docs'
53
+ Requires-Dist: mkdocstrings==0.27.0; extra == 'docs'
54
+ Requires-Dist: qtconsole!=4.7.6,!=5.4.2,>=4.5.1; extra == 'docs'
55
+ Requires-Dist: sentry-sdk>2; extra == 'docs'
56
+ Provides-Extra: palette
57
+ Requires-Dist: qt-command-palette; extra == 'palette'
58
+ Provides-Extra: pyqt5
59
+ Requires-Dist: pyqt5; extra == 'pyqt5'
60
+ Provides-Extra: pyqt6
61
+ Requires-Dist: pyqt6; extra == 'pyqt6'
62
+ Provides-Extra: pyside2
63
+ Requires-Dist: pyside2; extra == 'pyside2'
64
+ Provides-Extra: pyside6
65
+ Requires-Dist: pyside6; extra == 'pyside6'
66
+ Provides-Extra: reload
67
+ Requires-Dist: qtreload; extra == 'reload'
68
+ Provides-Extra: sentry
69
+ Requires-Dist: sentry-sdk>2; extra == 'sentry'
70
+ Provides-Extra: test
71
+ Requires-Dist: pytest-cov; extra == 'test'
72
+ Requires-Dist: pytest-pretty; extra == 'test'
73
+ Requires-Dist: pytest-qt; extra == 'test'
74
+ Requires-Dist: pytest>=8.1; extra == 'test'
75
+ Description-Content-Type: text/markdown
76
+
77
+ # qtextra
78
+
79
+ [![License](https://img.shields.io/pypi/l/qtextra.svg?color=green)](https://github.com/lukasz-migas/qtextra/raw/main/LICENSE)
80
+ [![PyPI](https://img.shields.io/pypi/v/qtextra.svg?color=green)](https://pypi.org/project/qtextra)
81
+ [![Python Version](https://img.shields.io/pypi/pyversions/qtextra.svg?color=green)](https://python.org)
82
+ [![Test](https://github.com/lukasz-migas/qtextra/actions/workflows/test_and_deploy.yml/badge.svg?branch=main)](https://github.com/lukasz-migas/qtextra/actions/workflows/test_and_deploy.yml)
83
+ [![codecov](https://codecov.io/gh/lukasz-migas/qtextra/branch/main/graph/badge.svg)](https://codecov.io/gh/lukasz-migas/qtextra)
84
+
85
+ ### A bunch of *extra* widgets and components for PyQt/PySide
86
+
87
+ Here, you will find a bunch of extra widgets and components that you can use in your PySide/PyQt (using qtpy) applications.
88
+ The goal is to provide a set of widgets that are not available in the standard PyQt/PySide libraries, or that are not easy to use.
89
+
90
+ Components are tested on:
91
+
92
+ - macOS, Windows & Linux
93
+ - Python 3.9 and above
94
+ - PyQt5 (5.11 and above) & PyQt6
95
+ - Pyside2 (5.11 and above) & PySide6
96
+
97
+
98
+ This repository is fairly similar in scope to [superqt](https://github.com/pyapp-kit/superqt) which aims to provide a number of useful
99
+ widgets (in fact we use a couple of them in this library). The main difference is that we aimed to provide a more opinionated
100
+ style (with stylesheets available in the [assets](src/qtextra/assets/stylesheets) directory) and focus on providing a wider
101
+ range of widgets.
102
+
103
+ ## Contributing
104
+
105
+ Contributions are always welcome. Please feel free to submit PRs with new features, bug fixes, or documentation improvements.
106
+
107
+ ```bash
108
+ git clone https://github.com/illumion-io/qtextra.git
109
+
110
+ pip install -e .[dev]
111
+ ```
112
+
113
+
114
+ ## Release information
115
+
116
+ 1. Test code and make sure it works.
117
+ 2. Reinstall all dependencies and build app and test that it works.
118
+ 3. Update git tag and push it.
119
+ 4. Reinstall and build app.
120
+ 5. Upload to Dropbox.
121
+ 6. Update the latest.json file in Dropbox.
122
+ 7. Create release with changelog on GitHub (autoims-docs).
@@ -0,0 +1,46 @@
1
+ # qtextra
2
+
3
+ [![License](https://img.shields.io/pypi/l/qtextra.svg?color=green)](https://github.com/lukasz-migas/qtextra/raw/main/LICENSE)
4
+ [![PyPI](https://img.shields.io/pypi/v/qtextra.svg?color=green)](https://pypi.org/project/qtextra)
5
+ [![Python Version](https://img.shields.io/pypi/pyversions/qtextra.svg?color=green)](https://python.org)
6
+ [![Test](https://github.com/lukasz-migas/qtextra/actions/workflows/test_and_deploy.yml/badge.svg?branch=main)](https://github.com/lukasz-migas/qtextra/actions/workflows/test_and_deploy.yml)
7
+ [![codecov](https://codecov.io/gh/lukasz-migas/qtextra/branch/main/graph/badge.svg)](https://codecov.io/gh/lukasz-migas/qtextra)
8
+
9
+ ### A bunch of *extra* widgets and components for PyQt/PySide
10
+
11
+ Here, you will find a bunch of extra widgets and components that you can use in your PySide/PyQt (using qtpy) applications.
12
+ The goal is to provide a set of widgets that are not available in the standard PyQt/PySide libraries, or that are not easy to use.
13
+
14
+ Components are tested on:
15
+
16
+ - macOS, Windows & Linux
17
+ - Python 3.9 and above
18
+ - PyQt5 (5.11 and above) & PyQt6
19
+ - Pyside2 (5.11 and above) & PySide6
20
+
21
+
22
+ This repository is fairly similar in scope to [superqt](https://github.com/pyapp-kit/superqt) which aims to provide a number of useful
23
+ widgets (in fact we use a couple of them in this library). The main difference is that we aimed to provide a more opinionated
24
+ style (with stylesheets available in the [assets](src/qtextra/assets/stylesheets) directory) and focus on providing a wider
25
+ range of widgets.
26
+
27
+ ## Contributing
28
+
29
+ Contributions are always welcome. Please feel free to submit PRs with new features, bug fixes, or documentation improvements.
30
+
31
+ ```bash
32
+ git clone https://github.com/illumion-io/qtextra.git
33
+
34
+ pip install -e .[dev]
35
+ ```
36
+
37
+
38
+ ## Release information
39
+
40
+ 1. Test code and make sure it works.
41
+ 2. Reinstall all dependencies and build app and test that it works.
42
+ 3. Update git tag and push it.
43
+ 4. Reinstall and build app.
44
+ 5. Upload to Dropbox.
45
+ 6. Update the latest.json file in Dropbox.
46
+ 7. Create release with changelog on GitHub (autoims-docs).
@@ -0,0 +1,236 @@
1
+ [build-system]
2
+ requires = ["hatchling", "hatch-vcs"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [tool.hatch.version]
6
+ source = "vcs"
7
+
8
+ [tool.hatch.build.targets.sdist]
9
+ include = ["src", "tests", "CHANGELOG.md"]
10
+
11
+ # https://peps.python.org/pep-0621/
12
+ [project]
13
+ name = "qtextra"
14
+ description = "Extra widgets for Qt"
15
+ readme = "README.md"
16
+ requires-python = ">=3.8"
17
+ license = { text = "BSD 3-Clause License" }
18
+ authors = [
19
+ { email = "lukas.migas@yahoo.com", name = "Lukasz G. Migas" },
20
+ ]
21
+ classifiers = [
22
+ "Development Status :: 3 - Alpha",
23
+ "License :: OSI Approved :: BSD License",
24
+ "Natural Language :: English",
25
+ "Programming Language :: Python :: 3",
26
+ "Programming Language :: Python :: 3.8",
27
+ "Programming Language :: Python :: 3.9",
28
+ "Programming Language :: Python :: 3.10",
29
+ "Typing :: Typed",
30
+ ]
31
+ dynamic = ["version"]
32
+ dependencies = [
33
+ "qtpy",
34
+ "superqt>=0.7.1",
35
+ "qtawesome",
36
+ "koyo",
37
+ "numpy",
38
+ "appdirs",
39
+ "psygnal",
40
+ "pydantic>2",
41
+ "pydantic-extra-types"
42
+ ]
43
+
44
+ # extras
45
+ # https://peps.python.org/pep-0621/#dependencies-optional-dependencies
46
+ [project.optional-dependencies]
47
+ all = ["console", "sentry", "pyqt6"]
48
+ #notify = ["pyqt-toast-notification"]
49
+ sentry = ["sentry-sdk>2"]
50
+ console = [
51
+ "qtconsole>=4.5.1,!=4.7.6,!=5.4.2",
52
+ "ipykernel>=5.2.0",
53
+ ]
54
+ palette = ["qt-command-palette"]
55
+ reload = ["qtreload"]
56
+ pyside2 = ["pyside2"]
57
+ pyside6 = ["pyside6"]
58
+ pyqt5 = ["pyqt5"]
59
+ pyqt6 = ["pyqt6"]
60
+ test = [
61
+ "pytest>=8.1",
62
+ "pytest-cov",
63
+ "pytest-qt",
64
+ "pytest-pretty",
65
+ ]
66
+ dev = [
67
+ "ipython",
68
+ "mypy",
69
+ "pdbpp",
70
+ "pre-commit",
71
+ "rich",
72
+ "ruff",
73
+ "check-manifest",
74
+ "qtextra[test,reload]",
75
+ ]
76
+ docs = [
77
+ "mkdocs-macros-plugin ==1.3.7",
78
+ "mkdocs-material ==9.6.12",
79
+ "mkdocstrings ==0.27.0",
80
+ "mkdocstrings-python ==1.16.10",
81
+ "qtextra[console,sentry]",
82
+ ]
83
+
84
+ [project.urls]
85
+ homepage = "https://github.com/illumion-io/qtextra"
86
+ repository = "https://github.com/illumion-io/qtextra"
87
+
88
+ # same as console_scripts entry point
89
+ # [project.scripts]
90
+ # spam-cli = "spam:main_cli"
91
+
92
+ # Entry points
93
+ # https://peps.python.org/pep-0621/#entry-points
94
+ # [project.entry-points."spam.magical"]
95
+ # tomatoes = "spam:main_tomatoes"
96
+
97
+ # https://github.com/charliermarsh/ruff
98
+ [tool.ruff]
99
+ line-length = 120
100
+ target-version = "py39"
101
+ src = ["src", "tests"]
102
+
103
+ # https://beta.ruff.rs/docs/rules/
104
+ [tool.ruff.lint]
105
+ extend-select = [
106
+ "E", # style errors
107
+ "W", # style warnings
108
+ "F", # flakes
109
+ "D", # pydocstyle
110
+ "I", # isort
111
+ "U", # pyupgrade
112
+ # "S", # bandit
113
+ "C", # flake8-comprehensions
114
+ "B", # flake8-bugbear
115
+ "A001", # flake8-builtins
116
+ "RUF", # ruff-specific rules
117
+ ]
118
+ # I do this to get numpy-style docstrings AND retain
119
+ # D417 (Missing argument descriptions in the docstring)
120
+ # otherwise, see:
121
+ # https://beta.ruff.rs/docs/faq/#does-ruff-support-numpy-or-google-style-docstrings
122
+ # https://github.com/charliermarsh/ruff/issues/2606
123
+ extend-ignore = [
124
+ "D100", # Missing docstring in public module
125
+ "D105", # Missing docstring in magic method
126
+ "D107", # Missing docstring in __init__
127
+ "D203", # 1 blank line required before class docstring
128
+ "D212", # Multi-line docstring summary should start at the first line
129
+ "D213", # Multi-line docstring summary should start at the second line
130
+ "D401", # First line should be in imperative mood
131
+ "D404", # First word of the docstring should not be This
132
+ "D413", # Missing blank line after last section
133
+ "D416", # Section name should end with a colon
134
+ "E501",
135
+ "UP006",
136
+ "UP007",
137
+ "TC001",
138
+ "TC002",
139
+ "TC003",
140
+ "S101", # Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
141
+ "B019",
142
+ "S311",
143
+ "C901", # too complex
144
+ "S603",
145
+ # temporary
146
+ "D205", # 1 blank line required between summary line and description
147
+ "S606",
148
+ "S607",
149
+ ]
150
+
151
+ [tool.ruff.lint.per-file-ignores]
152
+ "tests/*.py" = ["D", "S"]
153
+
154
+ [tool.ruff.lint.flake8-tidy-imports]
155
+ # Disallow all relative imports.
156
+ ban-relative-imports = "all"
157
+
158
+ # https://docs.astral.sh/ruff/formatter/
159
+ [tool.ruff.format]
160
+ docstring-code-format = true
161
+
162
+ # https://docs.pytest.org/en/6.2.x/customize.html
163
+ [tool.pytest.ini_options]
164
+ minversion = "8"
165
+ console_output_style = "count"
166
+ testpaths = ["qtextra", "tests"]
167
+ xfail_strict = true
168
+ # options so that we can see the stdout and loguru logs
169
+ addopts = [
170
+ "-ras",
171
+ "-vv",
172
+ "--maxfail=10",
173
+ "--durations=10",
174
+ "--log-cli-level=DEBUG",
175
+ "--log-cli-format=%(asctime)s - %(levelname)s - %(message)s",
176
+ ]
177
+ filterwarnings = [
178
+ "error:::qtextra", # turn warnings from qtextra into errors
179
+ "error:::test_.*", # turn warnings in our own tests into errors
180
+ "ignore::DeprecationWarning:shibokensupport",
181
+ "ignore::DeprecationWarning:ipykernel",
182
+ "ignore:numpy.ufunc size changed:RuntimeWarning",
183
+ "ignore:There is no current event loop:DeprecationWarning:",
184
+ ]
185
+
186
+ # https://mypy.readthedocs.io/en/stable/config_file.html
187
+ [tool.mypy]
188
+ files = "src/**/"
189
+ strict = true
190
+ disallow_any_generics = false
191
+ disallow_subclassing_any = false
192
+ show_error_codes = true
193
+ pretty = true
194
+
195
+ # # module specific overrides
196
+ # [[tool.mypy.overrides]]
197
+ # module = ["numpy.*",]
198
+ # ignore_errors = true
199
+
200
+ # https://coverage.readthedocs.io/en/6.4/config.html
201
+ [tool.coverage.run]
202
+ source = ["src"]
203
+ omit = [
204
+ "**/*_version.py"
205
+ ]
206
+
207
+ # https://coverage.readthedocs.io/en/6.4/config.html
208
+ [tool.coverage.report]
209
+ exclude_lines = [
210
+ "pragma: no cover",
211
+ "if TYPE_CHECKING:",
212
+ "@overload",
213
+ "except ImportError",
214
+ "\\.\\.\\.",
215
+ "raise NotImplementedError()",
216
+ ]
217
+
218
+ # https://github.com/mgedmin/check-manifest#configuration
219
+ [tool.check-manifest]
220
+ ignore = [
221
+ ".github_changelog_generator",
222
+ ".pre-commit-config.yaml",
223
+ ".ruff_cache/**/*",
224
+ "setup.py",
225
+ "tests/**/*",
226
+ ".idea/**/*",
227
+ "_version.py",
228
+ "venv*/**/*",
229
+ "tox.ini",
230
+ "codecov.yml",
231
+ "mkdocs.yml",
232
+ "renovate.json",
233
+ "docs/**/*",
234
+ "examples/**/*",
235
+ "MANIFEST.in",
236
+ ]
@@ -0,0 +1,10 @@
1
+ """Extra widgets for Qt."""
2
+
3
+ from loguru import logger
4
+
5
+ __version__ = "0.1.2"
6
+ __author__ = "Lukasz G. Migas"
7
+ __email__ = "lukas.migas@yahoo.com"
8
+ __issue_url__ = "https://github.com/illumion-io/qtextra-issues/issues"
9
+ __project_url__ = "https://ionglow.io/qtextra"
10
+ logger.disable("qtextra")
@@ -0,0 +1,115 @@
1
+ """
2
+ This module provides compatibility between pydantic v1 and v2.
3
+
4
+ Keep using this compatibility module until we stop using any pydantic v1 API functionality.
5
+ This can be removed when everything has been migrated to pydantic v2.
6
+ """
7
+
8
+ from functools import partial
9
+
10
+ try:
11
+ # The Pydantic V2 package can access the Pydantic V1 API by importing through `pydantic.v1`.
12
+ # See https://docs.pydantic.dev/latest/migration/#continue-using-pydantic-v1-features
13
+ from pydantic.v1 import (
14
+ BaseModel,
15
+ BaseSettings,
16
+ EmailStr,
17
+ Extra,
18
+ Field,
19
+ PositiveInt,
20
+ PrivateAttr,
21
+ ValidationError,
22
+ color,
23
+ conlist,
24
+ constr,
25
+ errors,
26
+ main,
27
+ parse_obj_as,
28
+ root_validator,
29
+ types,
30
+ utils,
31
+ validator,
32
+ )
33
+ from pydantic.v1.env_settings import (
34
+ EnvSettingsSource,
35
+ SettingsError,
36
+ SettingsSourceCallable,
37
+ )
38
+ from pydantic.v1.error_wrappers import ErrorWrapper, display_errors
39
+ from pydantic.v1.fields import SHAPE_LIST, ModelField
40
+ from pydantic.v1.generics import GenericModel
41
+ from pydantic.v1.main import ClassAttribute, ModelMetaclass
42
+ from pydantic.v1.utils import ROOT_KEY, sequence_like
43
+
44
+ except (AttributeError, ImportError):
45
+ from pydantic import (
46
+ BaseModel,
47
+ BaseSettings,
48
+ EmailStr,
49
+ Extra,
50
+ Field,
51
+ PositiveInt,
52
+ PrivateAttr,
53
+ ValidationError,
54
+ color,
55
+ conlist,
56
+ constr,
57
+ errors,
58
+ main,
59
+ parse_obj_as,
60
+ root_validator,
61
+ types,
62
+ utils,
63
+ validator,
64
+ )
65
+ from pydantic.env_settings import (
66
+ EnvSettingsSource,
67
+ SettingsError,
68
+ SettingsSourceCallable,
69
+ )
70
+ from pydantic.error_wrappers import ErrorWrapper, display_errors
71
+ from pydantic.fields import SHAPE_LIST, ModelField
72
+ from pydantic.generics import GenericModel
73
+ from pydantic.main import ModelMetaclass
74
+ from pydantic.utils import ROOT_KEY, ClassAttribute, sequence_like
75
+
76
+ Color = color.Color
77
+ validator_reuse = partial(validator, allow_reuse=True, pre=True)
78
+ validator_reuse_opt = partial(validator, allow_reuse=True, pre=True, check_fields=False)
79
+
80
+
81
+ __all__ = (
82
+ "ROOT_KEY",
83
+ "SHAPE_LIST",
84
+ "BaseModel",
85
+ "BaseSettings",
86
+ "ClassAttribute",
87
+ "Color",
88
+ "EmailStr",
89
+ "EnvSettingsSource",
90
+ "ErrorWrapper",
91
+ "Extra",
92
+ "Field",
93
+ "GenericModel",
94
+ "ModelField",
95
+ "ModelMetaclass",
96
+ "PositiveInt",
97
+ "PrivateAttr",
98
+ "SettingsError",
99
+ "SettingsSourceCallable",
100
+ "ValidationError",
101
+ "color",
102
+ "conlist",
103
+ "constr",
104
+ "display_errors",
105
+ "errors",
106
+ "main",
107
+ "parse_obj_as",
108
+ "root_validator",
109
+ "sequence_like",
110
+ "types",
111
+ "utils",
112
+ "validator",
113
+ "validator_reuse",
114
+ "validator_reuse_opt",
115
+ )