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.
- {composeui-0.1.0 → composeui-0.2.0}/AGENTS.md +26 -1
- composeui-0.2.0/CHANGELOG.md +128 -0
- {composeui-0.1.0 → composeui-0.2.0}/PKG-INFO +1 -1
- composeui-0.2.0/ROADMAP.md +703 -0
- {composeui-0.1.0 → composeui-0.2.0}/css/app.css +26 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/_site/llms.txt +1 -1
- {composeui-0.1.0 → composeui-0.2.0}/docs/_site/skills/composeui/SKILL.md +25 -5
- composeui-0.2.0/docs/api/dashboard.md +5 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/index.md +1 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/examples-guide.md +24 -18
- {composeui-0.1.0 → composeui-0.2.0}/docs/screenshots.py +2 -2
- {composeui-0.1.0 → composeui-0.2.0}/docs/technical-guide.md +3 -3
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/building-views.md +77 -1
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/charts.md +10 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/organizing-the-window.md +61 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/running-the-app.md +43 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/tables.md +36 -11
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/threads.md +116 -2
- composeui-0.2.0/docs/user-guide/widgets.md +497 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide.md +9 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/application.py +37 -4
- composeui-0.2.0/src/composeui/core/dashboard.py +46 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/dataframesource.py +5 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/jobs.py +104 -8
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/model.py +4 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/registry.py +5 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/reload.py +9 -3
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/study.py +3 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/view.py +742 -25
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/locales/fr.json +21 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/qtapplication.py +4 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/qtrenderer.py +399 -113
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qchart.py +9 -5
- composeui-0.2.0/src/composeui/qtcore/widgets/qconsole.py +222 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qtexttable.py +53 -15
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qvaluecombobox.py +4 -6
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/textualapplication.py +4 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/textualrenderer.py +330 -112
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composecombobox.py +5 -3
- composeui-0.2.0/src/composeui/textualcore/widgets/composeconsole.py +274 -0
- composeui-0.2.0/src/composeui/textualcore/widgets/composefilepathinput.py +244 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeradioset.py +2 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetable.py +63 -16
- composeui-0.2.0/src/composeui/webcore/order.py +93 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/page.py +5 -2
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/routes.py +37 -14
- composeui-0.2.0/src/composeui/webcore/serverfiles.py +111 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/session.py +54 -10
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/app.css +1 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/page.js +174 -4
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/webapplication.py +7 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/webrenderer.py +1117 -130
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/PKG-INFO +1 -1
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/SOURCES.txt +12 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/scm_file_list.json +12 -0
- composeui-0.2.0/src/composeui.egg-info/scm_version.json +8 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/uberpickups.py +36 -64
- composeui-0.2.0/src/examples/uberpickupsframe.py +109 -0
- composeui-0.2.0/tests/console.py +56 -0
- composeui-0.2.0/tests/filters.py +37 -0
- composeui-0.2.0/tests/folderform.py +60 -0
- composeui-0.2.0/tests/lonerows.py +50 -0
- composeui-0.2.0/tests/studydialog.py +84 -0
- composeui-0.2.0/tests/studyfiles.py +68 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/tables.py +17 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_application.py +69 -2
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_browser.py +505 -14
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_dataframe_source.py +10 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_dialog.py +31 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_jobs.py +97 -2
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_qtrenderer.py +517 -5
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_reload.py +79 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_textual_renderer.py +619 -5
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_uberpickups.py +86 -85
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_uberpickupsframe.py +45 -34
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_view_state.py +132 -1
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_views.py +90 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_webrenderer.py +1082 -12
- composeui-0.1.0/CHANGELOG.md +0 -30
- composeui-0.1.0/ROADMAP.md +0 -252
- composeui-0.1.0/docs/user-guide/widgets.md +0 -247
- composeui-0.1.0/src/composeui/textualcore/widgets/composefilepathinput.py +0 -85
- composeui-0.1.0/src/composeui.egg-info/scm_version.json +0 -8
- composeui-0.1.0/src/examples/uberpickupsframe.py +0 -136
- {composeui-0.1.0 → composeui-0.2.0}/.gitignore +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/.python-version +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/LICENSE +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/MANIFEST.in +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/Makefile +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/README.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/css/uPlot.min.css +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/_ext/widgetcatalog.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/_static/composeui-icon.svg +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/_static/composeui-logo-dark.svg +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/_static/composeui-logo-light.svg +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/application.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/backends.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/chartimage.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/dataframesource.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/jobs.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/model.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/registry.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/reload.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/renderer.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/signal.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/sqlitemodel.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/study.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/translation.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/translationcheck.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/api/view.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/conf.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/index.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/coding-agents.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/core-concepts.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/csv-import.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/maps.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/sqlite-model.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/testing.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/user-guide/translation.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/docs/widgets.md +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/make.ps1 +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/pyproject.toml +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/setup.cfg +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/chartcolors.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/chartimage.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/renderer.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/signal.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/sqlitemodel.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/translation.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/core/translationcheck.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/images/composeui.svg +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/mypy.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/py.typed +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/maprenderer.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/map.qml +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qdatefield.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qexpander.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qfilepathfield.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qfiltertable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qformdialog.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qformlabel.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qmap.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qmarkicon.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qmetric.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qplaintext.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qradiogroup.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qsidebar.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qsourcetable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qsplitter.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qvalueslider.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/qtcore/widgets/qwindowrelease.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composebutton.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composechart.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composecheckbox.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composecollapsible.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composedateinput.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composedialog.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composefiltertable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeformdialog.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeinput.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composelist.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composemarkdown.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composemetric.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composesidebar.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composeslider.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composesourcetable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composesplitter.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetabbedcontent.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetoolbar.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/textualcore/widgets/composetree.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/headers.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/icons.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/limits.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/origin.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/cally.js +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/daisyui.LICENSE +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/deckgl.LICENSE +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/deckgl.min.js +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/htmx.min.js +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/uPlot.LICENSE +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui/webcore/static/uPlot.iife.min.js +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/dependency_links.txt +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/requires.txt +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/composeui.egg-info/top_level.txt +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/batman.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/largetable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/locales/pipeform/fr.json +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/locales/pipesweep/fr.json +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/locales/taskview/fr.json +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/markdownviewer.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipecatalogue.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipechart.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipeform.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/pipesweep.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/py.typed +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/taskview.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/textual_demo.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/src/examples/webhello.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/__init__.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/bookings.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/buildings.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/charts.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/datafiles.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/dialogs.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/expander.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/formdialog.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/grid.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/horizontal.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/hours.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/listview.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/locales/fr.json +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/maps.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/markdown.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/markup.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/metrics.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/pages.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/partial.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/sidebar.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/splitter.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/tabs.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_batman.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_chartimage.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_csv_typing.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_csv_url.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_csvsqlitetable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_docs.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_examples.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_form_dialog.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_form_dialog_typing.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_grid.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_largetable.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_list_view.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_llms_txt.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_maps.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_markdownviewer.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipecatalogue.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipechart.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipesweep.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_pipeview.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_qtapplication.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_record_table.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_renderer.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_renderer_registry.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_router.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_signal.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_source_table.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_sqlite_source.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_sqlitemodel.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_statusbar_thread_safety.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_table_looks.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_table_sort_filter.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_table_source.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_taskview.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_translation.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_translationcheck.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/test_validation.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/toolbar.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/translated.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/unlabelled.py +0 -0
- {composeui-0.1.0 → composeui-0.2.0}/tests/vertical.py +0 -0
- {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 "
|
|
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.
|
|
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
|