composeui 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. {composeui-0.1.0 → composeui-0.2.0}/AGENTS.md +26 -1
  2. composeui-0.2.0/CHANGELOG.md +128 -0
  3. {composeui-0.1.0 → composeui-0.2.0}/PKG-INFO +1 -1
  4. composeui-0.2.0/ROADMAP.md +703 -0
  5. {composeui-0.1.0 → composeui-0.2.0}/css/app.css +26 -0
  6. {composeui-0.1.0 → composeui-0.2.0}/docs/_site/llms.txt +1 -1
  7. {composeui-0.1.0 → composeui-0.2.0}/docs/_site/skills/composeui/SKILL.md +25 -5
  8. composeui-0.2.0/docs/api/dashboard.md +5 -0
  9. {composeui-0.1.0 → composeui-0.2.0}/docs/api/index.md +1 -0
  10. {composeui-0.1.0 → composeui-0.2.0}/docs/examples-guide.md +24 -18
  11. {composeui-0.1.0 → composeui-0.2.0}/docs/screenshots.py +2 -2
  12. {composeui-0.1.0 → composeui-0.2.0}/docs/technical-guide.md +3 -3
  13. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/building-views.md +77 -1
  14. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/charts.md +10 -0
  15. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/organizing-the-window.md +61 -0
  16. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/running-the-app.md +43 -0
  17. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/tables.md +36 -11
  18. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/threads.md +116 -2
  19. composeui-0.2.0/docs/user-guide/widgets.md +497 -0
  20. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide.md +9 -0
  21. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/application.py +37 -4
  22. composeui-0.2.0/src/composeui/core/dashboard.py +46 -0
  23. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/dataframesource.py +5 -1
  24. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/jobs.py +104 -8
  25. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/model.py +4 -1
  26. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/registry.py +5 -0
  27. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/reload.py +9 -3
  28. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/study.py +3 -0
  29. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/view.py +742 -25
  30. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/locales/fr.json +21 -1
  31. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/qtapplication.py +4 -0
  32. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/qtrenderer.py +399 -113
  33. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qchart.py +9 -5
  34. composeui-0.2.0/src/composeui/qtcore/widgets/qconsole.py +222 -0
  35. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qtexttable.py +53 -15
  36. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qvaluecombobox.py +4 -6
  37. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/textualapplication.py +4 -0
  38. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/textualrenderer.py +330 -112
  39. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composecombobox.py +5 -3
  40. composeui-0.2.0/src/composeui/textualcore/widgets/composeconsole.py +274 -0
  41. composeui-0.2.0/src/composeui/textualcore/widgets/composefilepathinput.py +244 -0
  42. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeradioset.py +2 -1
  43. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetable.py +63 -16
  44. composeui-0.2.0/src/composeui/webcore/order.py +93 -0
  45. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/page.py +5 -2
  46. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/routes.py +37 -14
  47. composeui-0.2.0/src/composeui/webcore/serverfiles.py +111 -0
  48. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/session.py +54 -10
  49. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/app.css +1 -1
  50. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/page.js +174 -4
  51. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/webapplication.py +7 -1
  52. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/webrenderer.py +1117 -130
  53. {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/PKG-INFO +1 -1
  54. {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/SOURCES.txt +12 -0
  55. {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/scm_file_list.json +12 -0
  56. composeui-0.2.0/src/composeui.egg-info/scm_version.json +8 -0
  57. {composeui-0.1.0 → composeui-0.2.0}/src/examples/uberpickups.py +36 -64
  58. composeui-0.2.0/src/examples/uberpickupsframe.py +109 -0
  59. composeui-0.2.0/tests/console.py +56 -0
  60. composeui-0.2.0/tests/filters.py +37 -0
  61. composeui-0.2.0/tests/folderform.py +60 -0
  62. composeui-0.2.0/tests/lonerows.py +50 -0
  63. composeui-0.2.0/tests/studydialog.py +84 -0
  64. composeui-0.2.0/tests/studyfiles.py +68 -0
  65. {composeui-0.1.0 → composeui-0.2.0}/tests/tables.py +17 -0
  66. {composeui-0.1.0 → composeui-0.2.0}/tests/test_application.py +69 -2
  67. {composeui-0.1.0 → composeui-0.2.0}/tests/test_browser.py +505 -14
  68. {composeui-0.1.0 → composeui-0.2.0}/tests/test_dataframe_source.py +10 -0
  69. {composeui-0.1.0 → composeui-0.2.0}/tests/test_dialog.py +31 -0
  70. {composeui-0.1.0 → composeui-0.2.0}/tests/test_jobs.py +97 -2
  71. {composeui-0.1.0 → composeui-0.2.0}/tests/test_qtrenderer.py +517 -5
  72. {composeui-0.1.0 → composeui-0.2.0}/tests/test_reload.py +79 -0
  73. {composeui-0.1.0 → composeui-0.2.0}/tests/test_textual_renderer.py +619 -5
  74. {composeui-0.1.0 → composeui-0.2.0}/tests/test_uberpickups.py +86 -85
  75. {composeui-0.1.0 → composeui-0.2.0}/tests/test_uberpickupsframe.py +45 -34
  76. {composeui-0.1.0 → composeui-0.2.0}/tests/test_view_state.py +132 -1
  77. {composeui-0.1.0 → composeui-0.2.0}/tests/test_views.py +90 -0
  78. {composeui-0.1.0 → composeui-0.2.0}/tests/test_webrenderer.py +1082 -12
  79. composeui-0.1.0/CHANGELOG.md +0 -30
  80. composeui-0.1.0/ROADMAP.md +0 -252
  81. composeui-0.1.0/docs/user-guide/widgets.md +0 -247
  82. composeui-0.1.0/src/composeui/textualcore/widgets/composefilepathinput.py +0 -85
  83. composeui-0.1.0/src/composeui.egg-info/scm_version.json +0 -8
  84. composeui-0.1.0/src/examples/uberpickupsframe.py +0 -136
  85. {composeui-0.1.0 → composeui-0.2.0}/.gitignore +0 -0
  86. {composeui-0.1.0 → composeui-0.2.0}/.python-version +0 -0
  87. {composeui-0.1.0 → composeui-0.2.0}/LICENSE +0 -0
  88. {composeui-0.1.0 → composeui-0.2.0}/MANIFEST.in +0 -0
  89. {composeui-0.1.0 → composeui-0.2.0}/Makefile +0 -0
  90. {composeui-0.1.0 → composeui-0.2.0}/README.md +0 -0
  91. {composeui-0.1.0 → composeui-0.2.0}/css/uPlot.min.css +0 -0
  92. {composeui-0.1.0 → composeui-0.2.0}/docs/_ext/widgetcatalog.py +0 -0
  93. {composeui-0.1.0 → composeui-0.2.0}/docs/_static/composeui-icon.svg +0 -0
  94. {composeui-0.1.0 → composeui-0.2.0}/docs/_static/composeui-logo-dark.svg +0 -0
  95. {composeui-0.1.0 → composeui-0.2.0}/docs/_static/composeui-logo-light.svg +0 -0
  96. {composeui-0.1.0 → composeui-0.2.0}/docs/api/application.md +0 -0
  97. {composeui-0.1.0 → composeui-0.2.0}/docs/api/backends.md +0 -0
  98. {composeui-0.1.0 → composeui-0.2.0}/docs/api/chartimage.md +0 -0
  99. {composeui-0.1.0 → composeui-0.2.0}/docs/api/dataframesource.md +0 -0
  100. {composeui-0.1.0 → composeui-0.2.0}/docs/api/jobs.md +0 -0
  101. {composeui-0.1.0 → composeui-0.2.0}/docs/api/model.md +0 -0
  102. {composeui-0.1.0 → composeui-0.2.0}/docs/api/registry.md +0 -0
  103. {composeui-0.1.0 → composeui-0.2.0}/docs/api/reload.md +0 -0
  104. {composeui-0.1.0 → composeui-0.2.0}/docs/api/renderer.md +0 -0
  105. {composeui-0.1.0 → composeui-0.2.0}/docs/api/signal.md +0 -0
  106. {composeui-0.1.0 → composeui-0.2.0}/docs/api/sqlitemodel.md +0 -0
  107. {composeui-0.1.0 → composeui-0.2.0}/docs/api/study.md +0 -0
  108. {composeui-0.1.0 → composeui-0.2.0}/docs/api/translation.md +0 -0
  109. {composeui-0.1.0 → composeui-0.2.0}/docs/api/translationcheck.md +0 -0
  110. {composeui-0.1.0 → composeui-0.2.0}/docs/api/view.md +0 -0
  111. {composeui-0.1.0 → composeui-0.2.0}/docs/conf.py +0 -0
  112. {composeui-0.1.0 → composeui-0.2.0}/docs/index.md +0 -0
  113. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/coding-agents.md +0 -0
  114. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/core-concepts.md +0 -0
  115. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/csv-import.md +0 -0
  116. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/maps.md +0 -0
  117. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/sqlite-model.md +0 -0
  118. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/testing.md +0 -0
  119. {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/translation.md +0 -0
  120. {composeui-0.1.0 → composeui-0.2.0}/docs/widgets.md +0 -0
  121. {composeui-0.1.0 → composeui-0.2.0}/make.ps1 +0 -0
  122. {composeui-0.1.0 → composeui-0.2.0}/pyproject.toml +0 -0
  123. {composeui-0.1.0 → composeui-0.2.0}/setup.cfg +0 -0
  124. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/__init__.py +0 -0
  125. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/__init__.py +0 -0
  126. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/chartcolors.py +0 -0
  127. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/chartimage.py +0 -0
  128. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/renderer.py +0 -0
  129. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/signal.py +0 -0
  130. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/sqlitemodel.py +0 -0
  131. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/translation.py +0 -0
  132. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/translationcheck.py +0 -0
  133. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/images/composeui.svg +0 -0
  134. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/mypy.py +0 -0
  135. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/py.typed +0 -0
  136. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/__init__.py +0 -0
  137. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/maprenderer.py +0 -0
  138. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/__init__.py +0 -0
  139. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/map.qml +0 -0
  140. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qdatefield.py +0 -0
  141. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qexpander.py +0 -0
  142. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qfilepathfield.py +0 -0
  143. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qfiltertable.py +0 -0
  144. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qformdialog.py +0 -0
  145. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qformlabel.py +0 -0
  146. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qmap.py +0 -0
  147. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qmarkicon.py +0 -0
  148. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qmetric.py +0 -0
  149. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qplaintext.py +0 -0
  150. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qradiogroup.py +0 -0
  151. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qsidebar.py +0 -0
  152. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qsourcetable.py +0 -0
  153. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qsplitter.py +0 -0
  154. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qvalueslider.py +0 -0
  155. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qwindowrelease.py +0 -0
  156. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/__init__.py +0 -0
  157. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/__init__.py +0 -0
  158. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composebutton.py +0 -0
  159. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composechart.py +0 -0
  160. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composecheckbox.py +0 -0
  161. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composecollapsible.py +0 -0
  162. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composedateinput.py +0 -0
  163. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composedialog.py +0 -0
  164. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composefiltertable.py +0 -0
  165. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeformdialog.py +0 -0
  166. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeinput.py +0 -0
  167. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composelist.py +0 -0
  168. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composemarkdown.py +0 -0
  169. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composemetric.py +0 -0
  170. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composesidebar.py +0 -0
  171. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeslider.py +0 -0
  172. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composesourcetable.py +0 -0
  173. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composesplitter.py +0 -0
  174. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetabbedcontent.py +0 -0
  175. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetoolbar.py +0 -0
  176. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetree.py +0 -0
  177. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/__init__.py +0 -0
  178. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/headers.py +0 -0
  179. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/icons.py +0 -0
  180. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/limits.py +0 -0
  181. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/origin.py +0 -0
  182. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/cally.js +0 -0
  183. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/daisyui.LICENSE +0 -0
  184. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/deckgl.LICENSE +0 -0
  185. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/deckgl.min.js +0 -0
  186. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/htmx.min.js +0 -0
  187. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/uPlot.LICENSE +0 -0
  188. {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/uPlot.iife.min.js +0 -0
  189. {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/dependency_links.txt +0 -0
  190. {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/requires.txt +0 -0
  191. {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/top_level.txt +0 -0
  192. {composeui-0.1.0 → composeui-0.2.0}/src/examples/__init__.py +0 -0
  193. {composeui-0.1.0 → composeui-0.2.0}/src/examples/batman.py +0 -0
  194. {composeui-0.1.0 → composeui-0.2.0}/src/examples/largetable.py +0 -0
  195. {composeui-0.1.0 → composeui-0.2.0}/src/examples/locales/pipeform/fr.json +0 -0
  196. {composeui-0.1.0 → composeui-0.2.0}/src/examples/locales/pipesweep/fr.json +0 -0
  197. {composeui-0.1.0 → composeui-0.2.0}/src/examples/locales/taskview/fr.json +0 -0
  198. {composeui-0.1.0 → composeui-0.2.0}/src/examples/markdownviewer.py +0 -0
  199. {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipecatalogue.py +0 -0
  200. {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipechart.py +0 -0
  201. {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipeform.py +0 -0
  202. {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipesweep.py +0 -0
  203. {composeui-0.1.0 → composeui-0.2.0}/src/examples/py.typed +0 -0
  204. {composeui-0.1.0 → composeui-0.2.0}/src/examples/taskview.py +0 -0
  205. {composeui-0.1.0 → composeui-0.2.0}/src/examples/textual_demo.py +0 -0
  206. {composeui-0.1.0 → composeui-0.2.0}/src/examples/webhello.py +0 -0
  207. {composeui-0.1.0 → composeui-0.2.0}/tests/__init__.py +0 -0
  208. {composeui-0.1.0 → composeui-0.2.0}/tests/bookings.py +0 -0
  209. {composeui-0.1.0 → composeui-0.2.0}/tests/buildings.py +0 -0
  210. {composeui-0.1.0 → composeui-0.2.0}/tests/charts.py +0 -0
  211. {composeui-0.1.0 → composeui-0.2.0}/tests/datafiles.py +0 -0
  212. {composeui-0.1.0 → composeui-0.2.0}/tests/dialogs.py +0 -0
  213. {composeui-0.1.0 → composeui-0.2.0}/tests/expander.py +0 -0
  214. {composeui-0.1.0 → composeui-0.2.0}/tests/formdialog.py +0 -0
  215. {composeui-0.1.0 → composeui-0.2.0}/tests/grid.py +0 -0
  216. {composeui-0.1.0 → composeui-0.2.0}/tests/horizontal.py +0 -0
  217. {composeui-0.1.0 → composeui-0.2.0}/tests/hours.py +0 -0
  218. {composeui-0.1.0 → composeui-0.2.0}/tests/listview.py +0 -0
  219. {composeui-0.1.0 → composeui-0.2.0}/tests/locales/fr.json +0 -0
  220. {composeui-0.1.0 → composeui-0.2.0}/tests/maps.py +0 -0
  221. {composeui-0.1.0 → composeui-0.2.0}/tests/markdown.py +0 -0
  222. {composeui-0.1.0 → composeui-0.2.0}/tests/markup.py +0 -0
  223. {composeui-0.1.0 → composeui-0.2.0}/tests/metrics.py +0 -0
  224. {composeui-0.1.0 → composeui-0.2.0}/tests/pages.py +0 -0
  225. {composeui-0.1.0 → composeui-0.2.0}/tests/partial.py +0 -0
  226. {composeui-0.1.0 → composeui-0.2.0}/tests/sidebar.py +0 -0
  227. {composeui-0.1.0 → composeui-0.2.0}/tests/splitter.py +0 -0
  228. {composeui-0.1.0 → composeui-0.2.0}/tests/tabs.py +0 -0
  229. {composeui-0.1.0 → composeui-0.2.0}/tests/test_batman.py +0 -0
  230. {composeui-0.1.0 → composeui-0.2.0}/tests/test_chartimage.py +0 -0
  231. {composeui-0.1.0 → composeui-0.2.0}/tests/test_csv_typing.py +0 -0
  232. {composeui-0.1.0 → composeui-0.2.0}/tests/test_csv_url.py +0 -0
  233. {composeui-0.1.0 → composeui-0.2.0}/tests/test_csvsqlitetable.py +0 -0
  234. {composeui-0.1.0 → composeui-0.2.0}/tests/test_docs.py +0 -0
  235. {composeui-0.1.0 → composeui-0.2.0}/tests/test_examples.py +0 -0
  236. {composeui-0.1.0 → composeui-0.2.0}/tests/test_form_dialog.py +0 -0
  237. {composeui-0.1.0 → composeui-0.2.0}/tests/test_form_dialog_typing.py +0 -0
  238. {composeui-0.1.0 → composeui-0.2.0}/tests/test_grid.py +0 -0
  239. {composeui-0.1.0 → composeui-0.2.0}/tests/test_largetable.py +0 -0
  240. {composeui-0.1.0 → composeui-0.2.0}/tests/test_list_view.py +0 -0
  241. {composeui-0.1.0 → composeui-0.2.0}/tests/test_llms_txt.py +0 -0
  242. {composeui-0.1.0 → composeui-0.2.0}/tests/test_maps.py +0 -0
  243. {composeui-0.1.0 → composeui-0.2.0}/tests/test_markdownviewer.py +0 -0
  244. {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipecatalogue.py +0 -0
  245. {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipechart.py +0 -0
  246. {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipesweep.py +0 -0
  247. {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipeview.py +0 -0
  248. {composeui-0.1.0 → composeui-0.2.0}/tests/test_qtapplication.py +0 -0
  249. {composeui-0.1.0 → composeui-0.2.0}/tests/test_record_table.py +0 -0
  250. {composeui-0.1.0 → composeui-0.2.0}/tests/test_renderer.py +0 -0
  251. {composeui-0.1.0 → composeui-0.2.0}/tests/test_renderer_registry.py +0 -0
  252. {composeui-0.1.0 → composeui-0.2.0}/tests/test_router.py +0 -0
  253. {composeui-0.1.0 → composeui-0.2.0}/tests/test_signal.py +0 -0
  254. {composeui-0.1.0 → composeui-0.2.0}/tests/test_source_table.py +0 -0
  255. {composeui-0.1.0 → composeui-0.2.0}/tests/test_sqlite_source.py +0 -0
  256. {composeui-0.1.0 → composeui-0.2.0}/tests/test_sqlitemodel.py +0 -0
  257. {composeui-0.1.0 → composeui-0.2.0}/tests/test_statusbar_thread_safety.py +0 -0
  258. {composeui-0.1.0 → composeui-0.2.0}/tests/test_table_looks.py +0 -0
  259. {composeui-0.1.0 → composeui-0.2.0}/tests/test_table_sort_filter.py +0 -0
  260. {composeui-0.1.0 → composeui-0.2.0}/tests/test_table_source.py +0 -0
  261. {composeui-0.1.0 → composeui-0.2.0}/tests/test_taskview.py +0 -0
  262. {composeui-0.1.0 → composeui-0.2.0}/tests/test_translation.py +0 -0
  263. {composeui-0.1.0 → composeui-0.2.0}/tests/test_translationcheck.py +0 -0
  264. {composeui-0.1.0 → composeui-0.2.0}/tests/test_validation.py +0 -0
  265. {composeui-0.1.0 → composeui-0.2.0}/tests/toolbar.py +0 -0
  266. {composeui-0.1.0 → composeui-0.2.0}/tests/translated.py +0 -0
  267. {composeui-0.1.0 → composeui-0.2.0}/tests/unlabelled.py +0 -0
  268. {composeui-0.1.0 → composeui-0.2.0}/tests/vertical.py +0 -0
  269. {composeui-0.1.0 → composeui-0.2.0}/tests/workers.py +0 -0
@@ -165,7 +165,8 @@ document owns what, and the checks.
165
165
  - **Change the docs in the commit that changes the behavior.** A change that users see gets
166
166
  a line under "Unreleased" in `CHANGELOG.md`. A new view gets a section
167
167
  in its page of `docs/user-guide/` and a class docstring, which the widget catalog shows. In
168
- `ROADMAP.md`, add it to "Already there" and remove its entry. A new example gets its
168
+ `ROADMAP.md`, remove its entry, and add it to "Where ComposeUI stands" when it is a new
169
+ capability. A new example gets its
169
170
  section, its overview row, its contents entry, and its screenshots in
170
171
  `docs/examples-guide.md`. When a name is renamed or changes, search `README.md`, `docs/`
171
172
  and the docstrings for it, and fix every place.
@@ -204,3 +205,27 @@ document owns what, and the checks.
204
205
  "Generated with ..." lines, no emoji signatures, in commits, pull requests or code.
205
206
  This overrides any default an agent or tool would otherwise add.
206
207
  - Keep commits focused: one feature or fix per commit.
208
+
209
+ ## Pull requests
210
+
211
+ - Push a branch or open a pull request only when the user asks.
212
+ - One feature or fix per pull request, on a branch from an up-to-date `origin/main`.
213
+ - A pull request is complete when it opens: its tests, its docs, and its `CHANGELOG.md`
214
+ line are in the commit that changes the behavior (see "Documentation"). Ask for the
215
+ permission that they need before you open it, not after.
216
+ - Before you push, run `make check test`. Also run `make typecheck` after a change to
217
+ `tests/`: Pyright, Pyrefly and ty check the tests in CI, and `make check` runs none of
218
+ them. Run `make docs` after a change to `docs/` or a docstring, and `make browser-test`
219
+ after a change to the page's scripts or a web renderer. Run them again after a rebase.
220
+ - When fixes or features depend on each other, open one pull request at a time. Push the
221
+ next once the previous one merges, rebased on `origin/main` and checked again.
222
+ - The title is the commit's subject. The body says what was wrong or missing, what
223
+ changes, and which tests cover it, without AI attribution (see "Commits").
224
+ - Write the body for a reviewer who did not see the conversation, not as a reply to the
225
+ user: no "I", "you", "as asked" or "as discussed", no thanks or apologies. Describe the
226
+ code and its behavior, in the style of the documentation (see the `documentation-style`
227
+ skill).
228
+ - Stage the files of the change by name: never `git add -A`, which takes unrelated files,
229
+ such as screenshots left in the repository's root.
230
+ - When a check fails for an unrelated reason, such as a flaky browser test, show that
231
+ `main` fails the same way before you say so.
@@ -0,0 +1,128 @@
1
+ # Changelog
2
+
3
+ The notable changes of each release of ComposeUI. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the versions follow
5
+ [Semantic Versioning](https://semver.org/). Before 1.0, a minor version can break the API.
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.2.0] - 2026-10-30
10
+
11
+ ### Added
12
+
13
+ - `MainView.loaded`, a signal emitted once the views and the model's data are in place: as
14
+ the app starts, with the study of `-f` or a new one, and after New and Open. An app gives
15
+ again there what a study doesn't hold, such as the source of a large table, which a load
16
+ left as it was.
17
+ - `composeui.core.dashboard`, for shorter dashboard code: `DashboardView`, a wide main view
18
+ without the File menu, and `bar_chart`, a bar chart as a view field's default.
19
+ - `Task.show_state`, which shows a task's loading, progress, or error in a label, and other
20
+ views only once the task has a result.
21
+ - `CheckBoxMixin.shows`, which shows other views only while the box is checked.
22
+ - `CellWidget.file_path`, a file path in each cell of a table's column: typed, or picked
23
+ with a "…" button. Qt and Textual open their file dialogs, and the web uploads the file.
24
+ - `ContentDialogView`, a dialog holding any view with OK and Cancel, such as a table to pick
25
+ a file from. The app enables OK with `is_accept_enabled`, and a subclass can keep the
26
+ dialog open on OK by overriding `accept`.
27
+ - `FilePathInputMixin.server_roots`, the folders of the server whose files the web's "…"
28
+ button lists, instead of uploading a copy. The field holds the path of the file on the
29
+ server. A typed path outside the roots gives `path` `None` on the web. Qt and Textual open
30
+ their dialogs in the first root.
31
+ - `SavePathInputView`, `RowSavePathInputView` and `LabelRowSavePathInputView`, the path of a
32
+ file to save, typed or picked in a save dialog, the first extension added to a name that
33
+ has none. The user agrees to replace a file that exists (`confirms_overwrite`). On the
34
+ web, the path is typed, or picked in the server's folders with `server_roots`.
35
+ - `FolderPathInputView`, `RowFolderPathInputView` and `LabelRowFolderPathInputView`, a
36
+ folder's path, typed or picked in a folder dialog. On the web, the path is typed, or picked
37
+ among the server's folders with `server_roots`.
38
+ - `CellWidget.file_path(..., server_roots=...)`, a table's file path cells picked among the
39
+ server's files, as a field's. On the web, a path typed outside the roots is refused: the
40
+ cell keeps its text, and the status bar says why (`TableView.file_texts`).
41
+ - `TableView.row_activated`, which emits a row's index when the user opens it with a double
42
+ click or Enter, as a large table's `row_activated` emits its id. A double click that edits
43
+ a cell, or clicks its button or link, doesn't open the row.
44
+ - `ConsoleView`, plain text that the app adds to as it comes, such as a process's output:
45
+ `append` adds text, "\r" starts a line again, and the view keeps the last `max_lines`
46
+ lines. It scrolls to its end unless the user scrolled up. On the web, a change sends only
47
+ the new lines.
48
+ - `current_backend()` and `renders(view_type)` in `composeui.core.application`: the views
49
+ that the app builds know its backend, and whether it shows a kind of view, such as a
50
+ `MapView`, which Textual doesn't show.
51
+ - `Task.disables` and `Task.cancel_with`: the views disabled while a task runs, and the
52
+ buttons or actions that cancel its run, enabled only until it is asked to stop. They
53
+ follow every start and outcome. `Task.is_canceled` tells a run asked to stop.
54
+ - A console saves its text to a file: a "Save output…" button on Qt, the key `s` on
55
+ Textual, and a download link on the web. `ConsoleView.export_text(path)` writes it, and
56
+ `export_filename` names the file at first.
57
+ - A console copies its whole text to the clipboard: a "Copy all" button on Qt and the web,
58
+ and the key `c` on Textual.
59
+ - A console searches its text: a search field on Qt and the web, `/` on Textual. Its
60
+ matches are highlighted, and a count says which one is current. New lines keep the
61
+ current match. `find_in_lines` finds them as the search does.
62
+ - A console removes the escape sequences of a terminal, such as ANSI color codes, from its
63
+ text. With `ConsoleView.ansi_colors`, it shows their colors and styles on every backend
64
+ (`TextStyle`, `line_styles`). Before, their characters showed in the text.
65
+ - A large table (`SourceTableView`) opens a row on the web too: a double click or Enter
66
+ emits its id with `row_activated`, as on Qt and Textual.
67
+
68
+ ### Changed
69
+
70
+ - `Task.cancel` emits `changed` when it cancels a run, so a `changed` callback can show that
71
+ the run is stopping. Called in a job's function, it raises `CalledInJobError`, as
72
+ `Task.start` does: call it on the main thread.
73
+
74
+ ### Fixed
75
+
76
+ - With reload on, an app that runs the changed code, then exits at once, is no longer started
77
+ again now and then. When the app acknowledged the change and exited between two of the
78
+ supervisor's looks, the supervisor took the exit for a request to run the code anew.
79
+ - On Textual, a file or folder picker loading a folder no longer fails now and then with a
80
+ `KeyError` on a style of its list. textual-fspicker read the styles from its loading
81
+ thread while Textual applied them again; they are read on the app's thread.
82
+ - A large table of a `DataFrameSource` whose `id_column` is also one of its columns shows its
83
+ rows. Its cells failed to read on Polars.
84
+ - A choice whose value is `None`, such as `{"All regions": None, "North": "north"}`, shows
85
+ as selected when `value` is `None`, and its study saves it as that choice. A combobox
86
+ showed nothing selected instead, on each backend.
87
+ - A job started before the main view shows, such as by `setup_model`, gives its result once
88
+ the view shows. A job over before then gave it to no backend: a quick load stayed on its
89
+ "Loading..." text.
90
+ - A chart shows the hovered values of a series of whole numbers, such as counts, as
91
+ integers: `45280`, not `4.528e+04`, and `12`, not `12.00`. Qt and the web showed 4
92
+ significant digits for every series. A series with other values still shows 4.
93
+ - A form row in another view than a `FormView`, such as a `LabelRowSliderView` in a
94
+ sidebar, shows its label, its field, and its message, as a form shows them. No backend
95
+ showed it, and nothing said why.
96
+ - A `FormView` shows its other views, such as a table or a row of buttons, in their place
97
+ between its rows, also in a form dialog. Every backend left them out, and nothing said
98
+ why.
99
+ - With reload on, an app that runs the changed code, then exits by itself soon after, such
100
+ as one closing its window, isn't started again in a new process. The supervisor took its
101
+ exit for a request to run the code anew.
102
+ - On the web, a click right after typing in a field sees the value typed, and Save or
103
+ Save As saves it. The field posts its value as the click takes the focus, and the server
104
+ could handle the click first.
105
+
106
+ ## [0.1.0] - 2026-10-27
107
+
108
+ The first release on PyPI.
109
+
110
+ ### Added
111
+
112
+ - Views as typed `attrs` classes, signals, models, and a `run` function that starts the app
113
+ on the backend that the command line chooses.
114
+ - Three backends: Qt (the `pyside6` extra), Textual (the `tui` extra), and the web
115
+ (the `web` extra, the default).
116
+ - Layouts, a status bar, menus, toolbars, inputs, forms and their checks, pages, tabs,
117
+ resizable panes, a sidebar, dialogs, tables, large tables, trees, Markdown, charts, and
118
+ street maps (Qt and the web).
119
+ - The state of the views saved to a study file and loaded from it. The file holds the
120
+ version of its format and the app's `state_version`, and `migrate_state` upgrades an
121
+ older one.
122
+ - Threads, SQLite models, CSV imports, translations, and tests of an app that need no backend.
123
+ - A skill for coding agents that write a ComposeUI app.
124
+ - `composeui.__version__`, the version of the installed package.
125
+
126
+ [Unreleased]: https://github.com/ehmoussi/composeui/compare/v0.2.0...HEAD
127
+ [0.2.0]: https://github.com/ehmoussi/composeui/compare/v0.1.0...v0.2.0
128
+ [0.1.0]: https://github.com/ehmoussi/composeui/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: composeui
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: A framework-agnostic MVVM layer for Python UIs: one app for Qt, Textual and the web
5
5
  Author-email: El Hadi Moussi <50993404+ehmoussi@users.noreply.github.com>
6
6
  License-Expression: MIT