beanhub-cli 3.1.1__tar.gz → 3.2.1__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.
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/.circleci/config.yml +33 -1
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/PKG-INFO +4 -4
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/cli.py +2 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/routes.py +3 -3
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/import_cli.py +203 -55
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/pyproject.toml +10 -4
- beanhub_cli-3.2.1/scripts/print_benchmark_results.py +32 -0
- beanhub_cli-3.2.1/tests/benchmark/conftest.py +363 -0
- beanhub_cli-3.2.1/tests/benchmark/test_import_cli_benchmark.py +52 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/uv.lock +1135 -1060
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/.gitignore +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/.pre-commit-config.yaml +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/LICENSE +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/README.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/assets/beanhub.svg +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/assets/forms-screenshot.png +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/aliase.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/api_helpers.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/auth.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/config.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/connect/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/connect/cli.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/connect/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/encryption.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/environment.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/file_io.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/format.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/constants.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/data/sample_forms_doc.yaml +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/deps.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/helpers.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/settings.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js.LICENSE.txt +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js.map +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/LICENSE +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.css +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.css.map +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.min.css +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/js/bootstrap-datepicker.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/js/bootstrap-datepicker.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker-en-CA.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar-DZ.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar-tn.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.az.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bg.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bm.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bn.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.br.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bs.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ca.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.cs.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.cy.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.da.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.de.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.el.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-AU.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-CA.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-GB.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-IE.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-NZ.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-US.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-ZA.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.eo.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.es.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.et.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.eu.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fa.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fi.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fo.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fr-CH.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fr.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.gl.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.he.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hi.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hr.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hu.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hy.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.id.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.is.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.it-CH.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.it.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ja.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ka.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kh.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kk.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.km.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kr.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.lt.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.lv.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.me.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mk.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mn.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mr.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ms.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.nl-BE.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.nl.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.no.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.oc.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pl.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pt.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ro.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.rs-latin.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.rs.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ru.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.si.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sk.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sl.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sq.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sr-latin.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sr.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sv.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sw.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ta.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tg.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.th.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tk.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tr.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uk.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uz-cyrl.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uz-latn.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.vi.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/LICENSE.txt +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/css/all.min.css +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-brands-400.ttf +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-brands-400.woff2 +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-regular-400.ttf +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-regular-400.woff2 +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-solid-900.ttf +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-solid-900.woff2 +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-v4compatibility.ttf +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-v4compatibility.woff2 +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/LICENSE.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/css/select2.css +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/css/select2.min.css +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/af.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ar.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/az.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bg.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bn.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bs.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ca.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/cs.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/da.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/de.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/dsb.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/el.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/en.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/eo.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/es.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/et.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/eu.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fa.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fi.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fr.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/gl.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/he.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hi.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hr.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hsb.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hu.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hy.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/id.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/is.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/it.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ja.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ka.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/km.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ko.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/lt.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/lv.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/mk.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ms.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/nb.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ne.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/nl.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pa.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pl.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ps.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pt-BR.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pt.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ro.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ru.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sk.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sl.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sq.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sr-Cyrl.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sr.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sv.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/te.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/th.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/tk.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/tr.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/uk.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/vi.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/zh-CN.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/zh-TW.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.full.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.full.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.min.js +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/templates/errors.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/templates/flash_messages.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/templates/footer.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/templates/form.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/templates/home.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/app/templates/layout.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/cli.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/forms/validator.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/inbox/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/inbox/cli.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/inbox/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/auth/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/auth/create_auth_session.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/auth/poll_auth_session.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/connect/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/connect/create_dump_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/connect/create_sync_batch.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/connect/get_dump_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/connect/get_sync_batch.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/inbox/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/inbox/create_inbox_dump_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/inbox/get_inbox_dump_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/inbox/get_inbox_emails.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/repo/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/api/repo/list_repo.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/client.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/errors.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/auth_session_not_ready_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/auth_session_poll_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/auth_session_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/auth_session_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/create_dump_request_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/create_dump_request_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/create_inbox_dump_request.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/create_inbox_dump_request_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/create_sync_batch_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/dump_request_state.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/generic_error.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/get_dump_request_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/get_inbox_dump_request_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/get_inbox_email_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/get_sync_batch_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/http_validation_error.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/inbox_dump_request_state.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/inbox_email.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/inbox_email_headers.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/item_data.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/list_repositories_response.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/plaid_item_sync_state.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/repository.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/repository_type.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/sync_data.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/models/validation_error.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/py.typed +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/internal_api/types.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/login.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/app/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/app/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/app/routes.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/cli.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/main.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/beanhub_cli/mcp/schemes.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/data/internal-api-config.yaml +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/data/internal-openapi.json +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/assets/favicon.svg +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/assets/logo.svg +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/commands/connect.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/commands/form.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/commands/format.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/commands/import.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/commands/login.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/getting-started.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/img/auth-session-screenshot.png +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/img/beanhub-connect-list.png +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/img/beanhub-connect-pop-up.png +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/img/forms-screenshot.png +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/docs/index.md +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/mkdocs.yml +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/netlify.toml +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/docs/requirements.txt +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/pytest.ini +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/scripts/gen-internal-api.sh +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/conftest.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/connect/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/connect/test_dump.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/connect/test_encryption.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/connect/test_sync.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/factories.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/forms/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/forms/app/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/forms/app/conftest.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/forms/app/test_forms.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/forms/app/types_def.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/forms/test_validator.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/helper.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/inbox/__init__.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/inbox/test_dump.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/test_format.py +0 -0
- {beanhub_cli-3.1.1 → beanhub_cli-3.2.1}/tests/test_login.py +0 -0
|
@@ -16,7 +16,35 @@ jobs:
|
|
|
16
16
|
command: pip install uv
|
|
17
17
|
- run:
|
|
18
18
|
name: Run test
|
|
19
|
-
command: uv run python -m pytest ./tests -svvvv
|
|
19
|
+
command: uv run python -m pytest ./tests --ignore=tests/benchmark -svvvv
|
|
20
|
+
benchmark:
|
|
21
|
+
docker:
|
|
22
|
+
- image: cimg/python:3.10.14
|
|
23
|
+
steps:
|
|
24
|
+
- checkout
|
|
25
|
+
- run:
|
|
26
|
+
name: Install uv
|
|
27
|
+
command: pip install uv
|
|
28
|
+
- run:
|
|
29
|
+
name: Run benchmarks
|
|
30
|
+
command: |
|
|
31
|
+
mkdir -p benchmark-results
|
|
32
|
+
uv run python -m pytest tests/benchmark \
|
|
33
|
+
--benchmark-only \
|
|
34
|
+
--benchmark-json=benchmark-results/benchmark.json \
|
|
35
|
+
--benchmark-save=ci \
|
|
36
|
+
--benchmark-group-by=param \
|
|
37
|
+
-v
|
|
38
|
+
- run:
|
|
39
|
+
name: Print benchmark summary
|
|
40
|
+
command: uv run python scripts/print_benchmark_results.py benchmark-results/benchmark.json
|
|
41
|
+
when: always
|
|
42
|
+
- store_artifacts:
|
|
43
|
+
path: benchmark-results
|
|
44
|
+
destination: benchmark-results
|
|
45
|
+
- store_artifacts:
|
|
46
|
+
path: .benchmarks
|
|
47
|
+
destination: benchmark-historical
|
|
20
48
|
build-and-publish:
|
|
21
49
|
docker:
|
|
22
50
|
- image: cimg/python:3.10.14
|
|
@@ -41,6 +69,10 @@ workflows:
|
|
|
41
69
|
# ref: https://discuss.circleci.com/t/builds-for-tags-not-triggering/17681/7
|
|
42
70
|
tags:
|
|
43
71
|
only: /^.*/
|
|
72
|
+
- benchmark:
|
|
73
|
+
filters:
|
|
74
|
+
tags:
|
|
75
|
+
only: /^.*/
|
|
44
76
|
- build-and-publish:
|
|
45
77
|
requires:
|
|
46
78
|
- test
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: beanhub-cli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.2.1
|
|
4
4
|
Summary: Command line tools for BeanHub and Beancount users
|
|
5
5
|
Project-URL: Documentation, https://beanhub-cli-docs.beanhub.io
|
|
6
6
|
Author-email: Fang-Pen Lin <fangpen@launchplatform.com>
|
|
7
7
|
License-Expression: MIT
|
|
8
8
|
License-File: LICENSE
|
|
9
|
-
Requires-Python:
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
10
|
Requires-Dist: attrs>=22.2.0
|
|
11
11
|
Requires-Dist: beancount-black<2,>=1.0.1
|
|
12
12
|
Requires-Dist: beancount-data>=3.0.2
|
|
@@ -14,10 +14,10 @@ Requires-Dist: beancount-exporter>=3.0.0
|
|
|
14
14
|
Requires-Dist: beancount-parser<1.3.0,>=1.2.3
|
|
15
15
|
Requires-Dist: beanhub-extract<1.0.0,>=0.1.0
|
|
16
16
|
Requires-Dist: beanhub-forms<0.2,>=0.1.3
|
|
17
|
-
Requires-Dist: beanhub-import<2
|
|
17
|
+
Requires-Dist: beanhub-import<2,>=1.4.1
|
|
18
18
|
Requires-Dist: beanhub-inbox<0.3.0,>=0.2.3
|
|
19
19
|
Requires-Dist: click<9,>=8.1.7
|
|
20
|
-
Requires-Dist: cryptography>=
|
|
20
|
+
Requires-Dist: cryptography>=49.0.0
|
|
21
21
|
Requires-Dist: fastapi-mcp>=0.3.7
|
|
22
22
|
Requires-Dist: fastapi<1.0.0,>=0.98.0
|
|
23
23
|
Requires-Dist: httpx<0.29.0,>=0.20.0
|
|
@@ -38,9 +38,9 @@ async def home(
|
|
|
38
38
|
sample_form_doc: deps.SampleFormDocDep,
|
|
39
39
|
):
|
|
40
40
|
return templates.TemplateResponse(
|
|
41
|
+
request,
|
|
41
42
|
"home.html",
|
|
42
43
|
dict(
|
|
43
|
-
request=request,
|
|
44
44
|
form_doc=form_doc,
|
|
45
45
|
sample_form_doc=sample_form_doc,
|
|
46
46
|
),
|
|
@@ -112,9 +112,9 @@ async def submit_form(
|
|
|
112
112
|
if form_schema.display_name is not None:
|
|
113
113
|
display_name = form_schema.display_name
|
|
114
114
|
return templates.TemplateResponse(
|
|
115
|
+
request,
|
|
115
116
|
"form.html",
|
|
116
117
|
dict(
|
|
117
|
-
request=request,
|
|
118
118
|
form_schema=form_schema,
|
|
119
119
|
display_name=display_name,
|
|
120
120
|
form=form,
|
|
@@ -150,9 +150,9 @@ def form_doc_errors(
|
|
|
150
150
|
value_error = exc
|
|
151
151
|
|
|
152
152
|
return templates.TemplateResponse(
|
|
153
|
+
request,
|
|
153
154
|
"errors.html",
|
|
154
155
|
dict(
|
|
155
|
-
request=request,
|
|
156
156
|
doc_path=doc_path,
|
|
157
157
|
validation_error=validation_error,
|
|
158
158
|
value_error=value_error,
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import concurrent.futures
|
|
2
|
+
import multiprocessing
|
|
3
|
+
import os
|
|
1
4
|
import pathlib
|
|
2
5
|
import sys
|
|
6
|
+
import time
|
|
3
7
|
|
|
4
8
|
import click
|
|
5
9
|
import rich
|
|
@@ -7,6 +11,7 @@ import yaml
|
|
|
7
11
|
from beancount_black.formatter import Formatter
|
|
8
12
|
from beancount_parser.parser import make_parser
|
|
9
13
|
from beanhub_extract.utils import strip_base_path
|
|
14
|
+
from beanhub_import.data_types import ChangeSet
|
|
10
15
|
from beanhub_import.data_types import DeletedTransaction
|
|
11
16
|
from beanhub_import.data_types import GeneratedTransaction
|
|
12
17
|
from beanhub_import.data_types import ImportDoc
|
|
@@ -15,10 +20,15 @@ from beanhub_import.post_processor import apply_change_set
|
|
|
15
20
|
from beanhub_import.post_processor import compute_changes
|
|
16
21
|
from beanhub_import.post_processor import extract_existing_transactions
|
|
17
22
|
from beanhub_import.post_processor import txn_to_text
|
|
18
|
-
from beanhub_import.processor import
|
|
23
|
+
from beanhub_import.processor import collect_import_files
|
|
24
|
+
from beanhub_import.processor import process_import_file
|
|
19
25
|
from rich import box
|
|
20
26
|
from rich.markup import escape
|
|
21
27
|
from rich.padding import Padding
|
|
28
|
+
from rich.progress import BarColumn
|
|
29
|
+
from rich.progress import Progress
|
|
30
|
+
from rich.progress import SpinnerColumn
|
|
31
|
+
from rich.progress import TextColumn
|
|
22
32
|
from rich.table import Table
|
|
23
33
|
|
|
24
34
|
from .cli import cli
|
|
@@ -28,6 +38,35 @@ from .environment import pass_env
|
|
|
28
38
|
IMPORT_DOC_FILE = pathlib.Path(".beanhub") / "imports.yaml"
|
|
29
39
|
TABLE_HEADER_STYLE = "yellow"
|
|
30
40
|
TABLE_COLUMN_STYLE = "cyan"
|
|
41
|
+
DEFAULT_WORKERS = os.cpu_count() or 1
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _process_context() -> multiprocessing.context.BaseContext:
|
|
45
|
+
if hasattr(os, "fork"):
|
|
46
|
+
return multiprocessing.get_context("forkserver")
|
|
47
|
+
return multiprocessing.get_context("spawn")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _apply_change_set_to_file(
|
|
51
|
+
target_file: pathlib.Path,
|
|
52
|
+
change_set: ChangeSet,
|
|
53
|
+
remove_dangling: bool,
|
|
54
|
+
) -> None:
|
|
55
|
+
parser = make_parser()
|
|
56
|
+
if not target_file.exists():
|
|
57
|
+
if change_set.remove or change_set.update:
|
|
58
|
+
raise ValueError("Expect new transactions to add only")
|
|
59
|
+
bean_content = "\n\n".join(map(txn_to_text, change_set.add))
|
|
60
|
+
new_tree = parser.parse(bean_content)
|
|
61
|
+
else:
|
|
62
|
+
tree = parser.parse(target_file.read_text())
|
|
63
|
+
new_tree = apply_change_set(
|
|
64
|
+
tree=tree, change_set=change_set, remove_dangling=remove_dangling
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
with target_file.open("wt") as fo:
|
|
68
|
+
formatter = Formatter()
|
|
69
|
+
formatter.format(new_tree, fo)
|
|
31
70
|
|
|
32
71
|
|
|
33
72
|
@cli.command(
|
|
@@ -51,19 +90,46 @@ TABLE_COLUMN_STYLE = "cyan"
|
|
|
51
90
|
@click.option(
|
|
52
91
|
"-b",
|
|
53
92
|
"--beanfile",
|
|
54
|
-
type=click.Path(
|
|
93
|
+
type=click.Path(dir_okay=False, file_okay=True),
|
|
55
94
|
default="main.bean",
|
|
56
|
-
help="The path to main entry beancount file",
|
|
95
|
+
help="The path to main entry beancount file, relative to workdir",
|
|
57
96
|
)
|
|
58
97
|
@click.option(
|
|
59
98
|
"--remove-dangling",
|
|
60
99
|
is_flag=True,
|
|
61
100
|
help="Remove dangling transactions (existing imported transactions in Beancount files without corresponding generated transactions)",
|
|
62
101
|
)
|
|
102
|
+
@click.option(
|
|
103
|
+
"-j",
|
|
104
|
+
"--workers",
|
|
105
|
+
type=click.IntRange(min=1),
|
|
106
|
+
default=DEFAULT_WORKERS,
|
|
107
|
+
show_default=True,
|
|
108
|
+
help="Number of workers for import processing and change-set application",
|
|
109
|
+
)
|
|
110
|
+
@click.option(
|
|
111
|
+
"-v",
|
|
112
|
+
"--verbose",
|
|
113
|
+
is_flag=True,
|
|
114
|
+
help="Log each generated, deleted, and skipped transaction",
|
|
115
|
+
)
|
|
116
|
+
@click.option(
|
|
117
|
+
"--detailed-report",
|
|
118
|
+
is_flag=True,
|
|
119
|
+
help="Show detailed transaction tables in the import report",
|
|
120
|
+
)
|
|
63
121
|
@pass_env
|
|
64
122
|
def main(
|
|
65
|
-
env: Environment,
|
|
123
|
+
env: Environment,
|
|
124
|
+
config: str,
|
|
125
|
+
workdir: str,
|
|
126
|
+
beanfile: str,
|
|
127
|
+
remove_dangling: bool,
|
|
128
|
+
workers: int,
|
|
129
|
+
verbose: bool,
|
|
130
|
+
detailed_report: bool,
|
|
66
131
|
):
|
|
132
|
+
start_time = time.perf_counter()
|
|
67
133
|
config_path = pathlib.Path(config)
|
|
68
134
|
with config_path.open("rt") as fo:
|
|
69
135
|
doc_payload = yaml.safe_load(fo)
|
|
@@ -78,38 +144,92 @@ def main(
|
|
|
78
144
|
generated_txns: list[GeneratedTransaction] = []
|
|
79
145
|
deleted_txns: list[DeletedTransaction] = []
|
|
80
146
|
unprocessed_txns: list[UnprocessedTransaction] = []
|
|
81
|
-
|
|
147
|
+
|
|
148
|
+
def handle_import_txn(
|
|
149
|
+
txn: GeneratedTransaction | DeletedTransaction | UnprocessedTransaction,
|
|
150
|
+
) -> None:
|
|
82
151
|
if isinstance(txn, GeneratedTransaction):
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
152
|
+
if verbose:
|
|
153
|
+
generated_file_path = (workdir_path / txn.file).resolve()
|
|
154
|
+
env.logger.info(
|
|
155
|
+
"Generated transaction [green]%s[/] to file [green]%s[/]",
|
|
156
|
+
txn.id,
|
|
157
|
+
strip_base_path(workdir_path.resolve(), generated_file_path),
|
|
158
|
+
extra={"markup": True, "highlighter": None},
|
|
159
|
+
)
|
|
90
160
|
generated_txns.append(txn)
|
|
91
161
|
elif isinstance(txn, DeletedTransaction):
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
162
|
+
if verbose:
|
|
163
|
+
env.logger.info(
|
|
164
|
+
"Deleted transaction [green]%s[/]",
|
|
165
|
+
txn.id,
|
|
166
|
+
extra={"markup": True, "highlighter": None},
|
|
167
|
+
)
|
|
97
168
|
deleted_txns.append(txn)
|
|
98
169
|
elif isinstance(txn, UnprocessedTransaction):
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
170
|
+
if verbose:
|
|
171
|
+
env.logger.info(
|
|
172
|
+
"Skipped input transaction %s at [green]%s[/]:[blue]%s[/]",
|
|
173
|
+
txn.import_id,
|
|
174
|
+
txn.txn.file,
|
|
175
|
+
txn.txn.lineno,
|
|
176
|
+
extra={"markup": True, "highlighter": None},
|
|
177
|
+
)
|
|
106
178
|
unprocessed_txns.append(txn)
|
|
107
179
|
else:
|
|
108
180
|
raise ValueError(f"Unexpected type {type(txn)}")
|
|
109
|
-
env.logger.info("Generated %s transactions", len(generated_txns))
|
|
110
|
-
env.logger.info("Deleted %s transactions", len(deleted_txns))
|
|
111
|
-
env.logger.info("Skipped %s transactions", len(unprocessed_txns))
|
|
112
181
|
|
|
182
|
+
import_files = collect_import_files(import_doc=import_doc, input_dir=workdir_path)
|
|
183
|
+
env.logger.info("Collected %s import files", len(import_files))
|
|
184
|
+
if verbose:
|
|
185
|
+
for import_file in import_files:
|
|
186
|
+
env.logger.info(
|
|
187
|
+
"Import file [green]%s[/]",
|
|
188
|
+
strip_base_path(workdir_path.resolve(), import_file.filepath.resolve()),
|
|
189
|
+
extra={"markup": True, "highlighter": None},
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
def iter_import_results():
|
|
193
|
+
with concurrent.futures.ProcessPoolExecutor(
|
|
194
|
+
max_workers=workers,
|
|
195
|
+
mp_context=_process_context(),
|
|
196
|
+
) as executor:
|
|
197
|
+
yield from zip(
|
|
198
|
+
import_files,
|
|
199
|
+
executor.map(process_import_file, import_files, chunksize=1),
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if verbose:
|
|
203
|
+
for import_file, results in iter_import_results():
|
|
204
|
+
env.logger.info(
|
|
205
|
+
"Processing import file [green]%s[/]",
|
|
206
|
+
strip_base_path(workdir_path.resolve(), import_file.filepath.resolve()),
|
|
207
|
+
extra={"markup": True, "highlighter": None},
|
|
208
|
+
)
|
|
209
|
+
for txn in results:
|
|
210
|
+
handle_import_txn(txn)
|
|
211
|
+
else:
|
|
212
|
+
with Progress(
|
|
213
|
+
SpinnerColumn(),
|
|
214
|
+
TextColumn("[progress.description]{task.description}"),
|
|
215
|
+
BarColumn(),
|
|
216
|
+
TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
|
|
217
|
+
transient=True,
|
|
218
|
+
) as progress:
|
|
219
|
+
task = progress.add_task("Processing imports", total=len(import_files))
|
|
220
|
+
for _import_file, results in iter_import_results():
|
|
221
|
+
for txn in results:
|
|
222
|
+
handle_import_txn(txn)
|
|
223
|
+
progress.advance(task)
|
|
224
|
+
progress.update(
|
|
225
|
+
task,
|
|
226
|
+
description=(
|
|
227
|
+
"Processing imports "
|
|
228
|
+
f"({len(generated_txns)} generated, "
|
|
229
|
+
f"{len(deleted_txns)} deleted, "
|
|
230
|
+
f"{len(unprocessed_txns)} skipped)"
|
|
231
|
+
),
|
|
232
|
+
)
|
|
113
233
|
beanfile_path = (workdir_path / pathlib.Path(beanfile)).resolve()
|
|
114
234
|
if not beanfile_path.is_relative_to(workdir_path.resolve()):
|
|
115
235
|
env.logger.error(
|
|
@@ -118,6 +238,12 @@ def main(
|
|
|
118
238
|
workdir_path,
|
|
119
239
|
)
|
|
120
240
|
sys.exit(-1)
|
|
241
|
+
if not beanfile_path.is_file():
|
|
242
|
+
env.logger.error(
|
|
243
|
+
"The provided beanfile path %s does not exist",
|
|
244
|
+
beanfile_path,
|
|
245
|
+
)
|
|
246
|
+
sys.exit(-1)
|
|
121
247
|
|
|
122
248
|
env.logger.info(
|
|
123
249
|
"Collecting existing imported transactions from Beancount books ..."
|
|
@@ -145,36 +271,58 @@ def main(
|
|
|
145
271
|
deleted_txns=deleted_txns,
|
|
146
272
|
work_dir=workdir_path,
|
|
147
273
|
)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
274
|
+
with concurrent.futures.ProcessPoolExecutor(
|
|
275
|
+
max_workers=workers,
|
|
276
|
+
mp_context=_process_context(),
|
|
277
|
+
) as executor:
|
|
278
|
+
futures = []
|
|
279
|
+
for target_file, change_set in change_sets.items():
|
|
280
|
+
if not target_file.exists():
|
|
281
|
+
if change_set.remove or change_set.update:
|
|
282
|
+
raise ValueError("Expect new transactions to add only")
|
|
283
|
+
env.logger.info(
|
|
284
|
+
"Create new bean file %s with %s transactions",
|
|
285
|
+
target_file,
|
|
286
|
+
len(change_set.add),
|
|
287
|
+
)
|
|
288
|
+
else:
|
|
289
|
+
env.logger.info(
|
|
290
|
+
"Applying change sets (add=%s, update=%s, remove=%s, dangling=%s) with remove_dangling=%s to %s",
|
|
291
|
+
len(change_set.add),
|
|
292
|
+
len(change_set.update),
|
|
293
|
+
len(change_set.remove),
|
|
294
|
+
len(change_set.dangling),
|
|
295
|
+
remove_dangling,
|
|
296
|
+
target_file,
|
|
297
|
+
)
|
|
298
|
+
futures.append(
|
|
299
|
+
executor.submit(
|
|
300
|
+
_apply_change_set_to_file,
|
|
301
|
+
target_file,
|
|
302
|
+
change_set,
|
|
303
|
+
remove_dangling,
|
|
304
|
+
)
|
|
156
305
|
)
|
|
306
|
+
for future in concurrent.futures.as_completed(futures):
|
|
307
|
+
future.result()
|
|
157
308
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
new_tree = apply_change_set(
|
|
172
|
-
tree=tree, change_set=change_set, remove_dangling=remove_dangling
|
|
173
|
-
)
|
|
309
|
+
dangling_count = sum(
|
|
310
|
+
len(change_set.dangling or []) for change_set in change_sets.values()
|
|
311
|
+
)
|
|
312
|
+
open_txn_count = sum(
|
|
313
|
+
1
|
|
314
|
+
for txn in unprocessed_txns
|
|
315
|
+
if txn.import_id not in imported_txns_with_override
|
|
316
|
+
)
|
|
317
|
+
env.logger.info("Generated %s transactions", len(generated_txns))
|
|
318
|
+
env.logger.info("Deleted %s transactions", len(deleted_txns))
|
|
319
|
+
env.logger.info("Skipped %s transactions", len(unprocessed_txns))
|
|
320
|
+
env.logger.info("Dangling %s transactions", dangling_count)
|
|
321
|
+
env.logger.info("Open %s transactions", open_txn_count)
|
|
174
322
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
323
|
+
if not detailed_report:
|
|
324
|
+
env.logger.info("done in %.2fs", time.perf_counter() - start_time)
|
|
325
|
+
return
|
|
178
326
|
|
|
179
327
|
table = Table(
|
|
180
328
|
title="Deleted transactions",
|
|
@@ -265,4 +413,4 @@ def main(
|
|
|
265
413
|
)
|
|
266
414
|
rich.print(Padding(table, (1, 0, 0, 4)))
|
|
267
415
|
|
|
268
|
-
env.logger.info("done")
|
|
416
|
+
env.logger.info("done in %.2fs", time.perf_counter() - start_time)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "beanhub-cli"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.2.1"
|
|
4
4
|
description = "Command line tools for BeanHub and Beancount users"
|
|
5
5
|
authors = [{ name = "Fang-Pen Lin", email = "fangpen@launchplatform.com" }]
|
|
6
|
-
requires-python = "
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
7
|
readme = "README.md"
|
|
8
8
|
license = "MIT"
|
|
9
9
|
dependencies = [
|
|
@@ -24,11 +24,11 @@ dependencies = [
|
|
|
24
24
|
"tomli>=2.2.1,<3",
|
|
25
25
|
"tomli-w>=1.1.0,<2",
|
|
26
26
|
"pynacl>=1.5.0,<2",
|
|
27
|
-
"beanhub-import>=
|
|
27
|
+
"beanhub-import>=1.4.1,<2",
|
|
28
28
|
"beanhub-extract>= 0.1.0, <1.0.0",
|
|
29
29
|
"beancount-parser>= 1.2.3, <1.3.0",
|
|
30
30
|
"beanhub-inbox>=0.2.3,<0.3.0",
|
|
31
|
-
"cryptography>=
|
|
31
|
+
"cryptography>=49.0.0",
|
|
32
32
|
"fastapi-mcp>=0.3.7",
|
|
33
33
|
"beancount-data>=3.0.2",
|
|
34
34
|
"beancount-exporter>=3.0.0",
|
|
@@ -47,6 +47,7 @@ dev = [
|
|
|
47
47
|
"pytest>=8.0.0,<9",
|
|
48
48
|
"pytest-asyncio>=0.21.1,<0.22",
|
|
49
49
|
"pytest-mock>=3.11.1,<4",
|
|
50
|
+
"pytest-benchmark>=4.0.0,<6",
|
|
50
51
|
"httpx>=0.28.0,<0.29",
|
|
51
52
|
"mkdocs-material>=9.5.35,<10",
|
|
52
53
|
"openapi-python-client>=0.23.0,<0.24",
|
|
@@ -54,6 +55,11 @@ dev = [
|
|
|
54
55
|
"pytest-factoryboy>=2.7.0",
|
|
55
56
|
]
|
|
56
57
|
|
|
58
|
+
[tool.pytest.ini_options]
|
|
59
|
+
markers = [
|
|
60
|
+
"benchmark: performance benchmark tests (may be slow)",
|
|
61
|
+
]
|
|
62
|
+
|
|
57
63
|
[build-system]
|
|
58
64
|
requires = ["hatchling"]
|
|
59
65
|
build-backend = "hatchling.build"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import json
|
|
3
|
+
import pathlib
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def main() -> int:
|
|
8
|
+
if len(sys.argv) != 2:
|
|
9
|
+
print(f"Usage: {sys.argv[0]} <benchmark.json>", file=sys.stderr)
|
|
10
|
+
return 1
|
|
11
|
+
|
|
12
|
+
payload = json.loads(pathlib.Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
13
|
+
benchmarks = payload.get("benchmarks", [])
|
|
14
|
+
if not benchmarks:
|
|
15
|
+
print("No benchmark results found.")
|
|
16
|
+
return 0
|
|
17
|
+
|
|
18
|
+
print("Benchmark summary (mean seconds):")
|
|
19
|
+
for item in sorted(benchmarks, key=lambda entry: entry["stats"]["mean"]):
|
|
20
|
+
stats = item["stats"]
|
|
21
|
+
print(
|
|
22
|
+
f"- {item['name']}: "
|
|
23
|
+
f"mean={stats['mean']:.4f}s "
|
|
24
|
+
f"min={stats['min']:.4f}s "
|
|
25
|
+
f"max={stats['max']:.4f}s "
|
|
26
|
+
f"rounds={stats['rounds']}"
|
|
27
|
+
)
|
|
28
|
+
return 0
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
if __name__ == "__main__":
|
|
32
|
+
raise SystemExit(main())
|