beanhub-cli 3.1.1__tar.gz → 3.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 (317) hide show
  1. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/.circleci/config.yml +33 -1
  2. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/PKG-INFO +3 -3
  3. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/cli.py +2 -0
  4. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/import_cli.py +203 -55
  5. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/pyproject.toml +9 -3
  6. beanhub_cli-3.2.0/scripts/print_benchmark_results.py +32 -0
  7. beanhub_cli-3.2.0/tests/benchmark/conftest.py +363 -0
  8. beanhub_cli-3.2.0/tests/benchmark/test_import_cli_benchmark.py +52 -0
  9. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/uv.lock +1030 -1035
  10. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/.gitignore +0 -0
  11. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/.pre-commit-config.yaml +0 -0
  12. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/LICENSE +0 -0
  13. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/README.md +0 -0
  14. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/assets/beanhub.svg +0 -0
  15. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/assets/forms-screenshot.png +0 -0
  16. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/__init__.py +0 -0
  17. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/aliase.py +0 -0
  18. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/api_helpers.py +0 -0
  19. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/auth.py +0 -0
  20. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/config.py +0 -0
  21. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/connect/__init__.py +0 -0
  22. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/connect/cli.py +0 -0
  23. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/connect/main.py +0 -0
  24. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/encryption.py +0 -0
  25. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/environment.py +0 -0
  26. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/file_io.py +0 -0
  27. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/format.py +0 -0
  28. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/__init__.py +0 -0
  29. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/__init__.py +0 -0
  30. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/constants.py +0 -0
  31. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/data/sample_forms_doc.yaml +0 -0
  32. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/deps.py +0 -0
  33. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/helpers.py +0 -0
  34. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/main.py +0 -0
  35. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/routes.py +0 -0
  36. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/settings.py +0 -0
  37. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js +0 -0
  38. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js.LICENSE.txt +0 -0
  39. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js.map +0 -0
  40. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/LICENSE +0 -0
  41. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.css +0 -0
  42. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.css.map +0 -0
  43. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.min.css +0 -0
  44. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/js/bootstrap-datepicker.js +0 -0
  45. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/js/bootstrap-datepicker.min.js +0 -0
  46. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker-en-CA.min.js +0 -0
  47. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar-DZ.min.js +0 -0
  48. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar-tn.min.js +0 -0
  49. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar.min.js +0 -0
  50. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.az.min.js +0 -0
  51. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bg.min.js +0 -0
  52. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bm.min.js +0 -0
  53. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bn.min.js +0 -0
  54. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.br.min.js +0 -0
  55. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bs.min.js +0 -0
  56. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ca.min.js +0 -0
  57. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.cs.min.js +0 -0
  58. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.cy.min.js +0 -0
  59. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.da.min.js +0 -0
  60. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.de.min.js +0 -0
  61. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.el.min.js +0 -0
  62. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-AU.min.js +0 -0
  63. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-CA.min.js +0 -0
  64. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-GB.min.js +0 -0
  65. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-IE.min.js +0 -0
  66. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-NZ.min.js +0 -0
  67. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-US.min.js +0 -0
  68. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-ZA.min.js +0 -0
  69. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.eo.min.js +0 -0
  70. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.es.min.js +0 -0
  71. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.et.min.js +0 -0
  72. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.eu.min.js +0 -0
  73. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fa.min.js +0 -0
  74. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fi.min.js +0 -0
  75. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fo.min.js +0 -0
  76. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fr-CH.min.js +0 -0
  77. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fr.min.js +0 -0
  78. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.gl.min.js +0 -0
  79. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.he.min.js +0 -0
  80. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hi.min.js +0 -0
  81. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hr.min.js +0 -0
  82. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hu.min.js +0 -0
  83. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hy.min.js +0 -0
  84. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.id.min.js +0 -0
  85. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.is.min.js +0 -0
  86. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.it-CH.min.js +0 -0
  87. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.it.min.js +0 -0
  88. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ja.min.js +0 -0
  89. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ka.min.js +0 -0
  90. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kh.min.js +0 -0
  91. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kk.min.js +0 -0
  92. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.km.min.js +0 -0
  93. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js +0 -0
  94. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kr.min.js +0 -0
  95. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.lt.min.js +0 -0
  96. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.lv.min.js +0 -0
  97. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.me.min.js +0 -0
  98. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mk.min.js +0 -0
  99. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mn.min.js +0 -0
  100. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mr.min.js +0 -0
  101. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ms.min.js +0 -0
  102. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.nl-BE.min.js +0 -0
  103. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.nl.min.js +0 -0
  104. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.no.min.js +0 -0
  105. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.oc.min.js +0 -0
  106. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pl.min.js +0 -0
  107. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.min.js +0 -0
  108. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pt.min.js +0 -0
  109. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ro.min.js +0 -0
  110. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.rs-latin.min.js +0 -0
  111. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.rs.min.js +0 -0
  112. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ru.min.js +0 -0
  113. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.si.min.js +0 -0
  114. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sk.min.js +0 -0
  115. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sl.min.js +0 -0
  116. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sq.min.js +0 -0
  117. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sr-latin.min.js +0 -0
  118. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sr.min.js +0 -0
  119. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sv.min.js +0 -0
  120. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sw.min.js +0 -0
  121. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ta.min.js +0 -0
  122. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tg.min.js +0 -0
  123. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.th.min.js +0 -0
  124. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tk.min.js +0 -0
  125. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tr.min.js +0 -0
  126. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uk.min.js +0 -0
  127. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uz-cyrl.min.js +0 -0
  128. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uz-latn.min.js +0 -0
  129. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.vi.min.js +0 -0
  130. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js +0 -0
  131. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.min.js +0 -0
  132. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/LICENSE.txt +0 -0
  133. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/css/all.min.css +0 -0
  134. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-brands-400.ttf +0 -0
  135. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-brands-400.woff2 +0 -0
  136. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-regular-400.ttf +0 -0
  137. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-regular-400.woff2 +0 -0
  138. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-solid-900.ttf +0 -0
  139. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-solid-900.woff2 +0 -0
  140. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-v4compatibility.ttf +0 -0
  141. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-v4compatibility.woff2 +0 -0
  142. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/LICENSE.md +0 -0
  143. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/css/select2.css +0 -0
  144. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/css/select2.min.css +0 -0
  145. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/af.js +0 -0
  146. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ar.js +0 -0
  147. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/az.js +0 -0
  148. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bg.js +0 -0
  149. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bn.js +0 -0
  150. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bs.js +0 -0
  151. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ca.js +0 -0
  152. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/cs.js +0 -0
  153. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/da.js +0 -0
  154. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/de.js +0 -0
  155. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/dsb.js +0 -0
  156. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/el.js +0 -0
  157. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/en.js +0 -0
  158. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/eo.js +0 -0
  159. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/es.js +0 -0
  160. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/et.js +0 -0
  161. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/eu.js +0 -0
  162. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fa.js +0 -0
  163. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fi.js +0 -0
  164. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fr.js +0 -0
  165. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/gl.js +0 -0
  166. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/he.js +0 -0
  167. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hi.js +0 -0
  168. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hr.js +0 -0
  169. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hsb.js +0 -0
  170. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hu.js +0 -0
  171. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hy.js +0 -0
  172. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/id.js +0 -0
  173. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/is.js +0 -0
  174. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/it.js +0 -0
  175. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ja.js +0 -0
  176. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ka.js +0 -0
  177. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/km.js +0 -0
  178. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ko.js +0 -0
  179. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/lt.js +0 -0
  180. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/lv.js +0 -0
  181. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/mk.js +0 -0
  182. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ms.js +0 -0
  183. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/nb.js +0 -0
  184. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ne.js +0 -0
  185. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/nl.js +0 -0
  186. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pa.js +0 -0
  187. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pl.js +0 -0
  188. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ps.js +0 -0
  189. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pt-BR.js +0 -0
  190. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pt.js +0 -0
  191. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ro.js +0 -0
  192. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ru.js +0 -0
  193. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sk.js +0 -0
  194. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sl.js +0 -0
  195. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sq.js +0 -0
  196. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sr-Cyrl.js +0 -0
  197. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sr.js +0 -0
  198. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sv.js +0 -0
  199. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/te.js +0 -0
  200. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/th.js +0 -0
  201. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/tk.js +0 -0
  202. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/tr.js +0 -0
  203. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/uk.js +0 -0
  204. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/vi.js +0 -0
  205. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/zh-CN.js +0 -0
  206. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/zh-TW.js +0 -0
  207. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/select2.full.js +0 -0
  208. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/select2.full.min.js +0 -0
  209. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/select2.js +0 -0
  210. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/static/vendor/select2/js/select2.min.js +0 -0
  211. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/templates/errors.html +0 -0
  212. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/templates/flash_messages.html +0 -0
  213. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/templates/footer.html +0 -0
  214. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/templates/form.html +0 -0
  215. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/templates/home.html +0 -0
  216. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/app/templates/layout.html +0 -0
  217. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/cli.py +0 -0
  218. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/main.py +0 -0
  219. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/forms/validator.py +0 -0
  220. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/inbox/__init__.py +0 -0
  221. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/inbox/cli.py +0 -0
  222. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/inbox/main.py +0 -0
  223. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/__init__.py +0 -0
  224. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/__init__.py +0 -0
  225. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/auth/__init__.py +0 -0
  226. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/auth/create_auth_session.py +0 -0
  227. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/auth/poll_auth_session.py +0 -0
  228. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/connect/__init__.py +0 -0
  229. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/connect/create_dump_request.py +0 -0
  230. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/connect/create_sync_batch.py +0 -0
  231. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/connect/get_dump_request.py +0 -0
  232. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/connect/get_sync_batch.py +0 -0
  233. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/inbox/__init__.py +0 -0
  234. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/inbox/create_inbox_dump_request.py +0 -0
  235. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/inbox/get_inbox_dump_request.py +0 -0
  236. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/inbox/get_inbox_emails.py +0 -0
  237. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/repo/__init__.py +0 -0
  238. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/api/repo/list_repo.py +0 -0
  239. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/client.py +0 -0
  240. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/errors.py +0 -0
  241. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/__init__.py +0 -0
  242. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/auth_session_not_ready_response.py +0 -0
  243. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/auth_session_poll_response.py +0 -0
  244. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/auth_session_request.py +0 -0
  245. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/auth_session_response.py +0 -0
  246. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/create_dump_request_request.py +0 -0
  247. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/create_dump_request_response.py +0 -0
  248. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/create_inbox_dump_request.py +0 -0
  249. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/create_inbox_dump_request_response.py +0 -0
  250. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/create_sync_batch_response.py +0 -0
  251. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/dump_request_state.py +0 -0
  252. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/generic_error.py +0 -0
  253. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/get_dump_request_response.py +0 -0
  254. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/get_inbox_dump_request_response.py +0 -0
  255. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/get_inbox_email_response.py +0 -0
  256. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/get_sync_batch_response.py +0 -0
  257. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/http_validation_error.py +0 -0
  258. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/inbox_dump_request_state.py +0 -0
  259. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/inbox_email.py +0 -0
  260. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/inbox_email_headers.py +0 -0
  261. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/item_data.py +0 -0
  262. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/list_repositories_response.py +0 -0
  263. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/plaid_item_sync_state.py +0 -0
  264. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/repository.py +0 -0
  265. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/repository_type.py +0 -0
  266. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/sync_data.py +0 -0
  267. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/models/validation_error.py +0 -0
  268. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/py.typed +0 -0
  269. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/internal_api/types.py +0 -0
  270. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/login.py +0 -0
  271. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/main.py +0 -0
  272. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/__init__.py +0 -0
  273. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/app/__init__.py +0 -0
  274. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/app/main.py +0 -0
  275. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/app/routes.py +0 -0
  276. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/cli.py +0 -0
  277. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/main.py +0 -0
  278. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/beanhub_cli/mcp/schemes.py +0 -0
  279. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/data/internal-api-config.yaml +0 -0
  280. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/data/internal-openapi.json +0 -0
  281. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/assets/favicon.svg +0 -0
  282. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/assets/logo.svg +0 -0
  283. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/commands/connect.md +0 -0
  284. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/commands/form.md +0 -0
  285. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/commands/format.md +0 -0
  286. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/commands/import.md +0 -0
  287. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/commands/login.md +0 -0
  288. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/getting-started.md +0 -0
  289. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/img/auth-session-screenshot.png +0 -0
  290. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/img/beanhub-connect-list.png +0 -0
  291. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/img/beanhub-connect-pop-up.png +0 -0
  292. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/img/forms-screenshot.png +0 -0
  293. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/docs/index.md +0 -0
  294. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/mkdocs.yml +0 -0
  295. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/netlify.toml +0 -0
  296. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  297. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/docs/requirements.txt +0 -0
  298. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/pytest.ini +0 -0
  299. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/scripts/gen-internal-api.sh +0 -0
  300. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/__init__.py +0 -0
  301. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/conftest.py +0 -0
  302. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/connect/__init__.py +0 -0
  303. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/connect/test_dump.py +0 -0
  304. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/connect/test_encryption.py +0 -0
  305. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/connect/test_sync.py +0 -0
  306. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/factories.py +0 -0
  307. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/forms/__init__.py +0 -0
  308. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/forms/app/__init__.py +0 -0
  309. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/forms/app/conftest.py +0 -0
  310. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/forms/app/test_forms.py +0 -0
  311. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/forms/app/types_def.py +0 -0
  312. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/forms/test_validator.py +0 -0
  313. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/helper.py +0 -0
  314. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/inbox/__init__.py +0 -0
  315. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/inbox/test_dump.py +0 -0
  316. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/tests/test_format.py +0 -0
  317. {beanhub_cli-3.1.1 → beanhub_cli-3.2.0}/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.1.1
3
+ Version: 3.2.0
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: ~=3.10
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,7 +14,7 @@ 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.0.0,>=1.0.0
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
20
  Requires-Dist: cryptography>=44.0.0
@@ -36,3 +36,5 @@ def cli(env: Environment, log_level: str):
36
36
  )
37
37
  httpx_logger = logging.getLogger("httpx")
38
38
  httpx_logger.level = logging.WARNING
39
+ beancount_black_logger = logging.getLogger("beancount_black.formatter")
40
+ beancount_black_logger.level = logging.WARNING
@@ -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 process_imports
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(exists=True, dir_okay=False, file_okay=True),
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, config: str, workdir: str, beanfile: str, remove_dangling: bool
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
- for txn in process_imports(import_doc=import_doc, input_dir=workdir_path):
147
+
148
+ def handle_import_txn(
149
+ txn: GeneratedTransaction | DeletedTransaction | UnprocessedTransaction,
150
+ ) -> None:
82
151
  if isinstance(txn, GeneratedTransaction):
83
- generated_file_path = (workdir_path / txn.file).resolve()
84
- env.logger.info(
85
- "Generated transaction [green]%s[/] to file [green]%s[/]",
86
- txn.id,
87
- strip_base_path(workdir_path.resolve(), generated_file_path),
88
- extra={"markup": True, "highlighter": None},
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
- env.logger.info(
93
- "Deleted transaction [green]%s[/]",
94
- txn.id,
95
- extra={"markup": True, "highlighter": None},
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
- env.logger.info(
100
- "Skipped input transaction %s at [green]%s[/]:[blue]%s[/]",
101
- txn.import_id,
102
- txn.txn.file,
103
- txn.txn.lineno,
104
- extra={"markup": True, "highlighter": None},
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
- for target_file, change_set in change_sets.items():
149
- if not target_file.exists():
150
- if change_set.remove or change_set.update:
151
- raise ValueError("Expect new transactions to add only")
152
- env.logger.info(
153
- "Create new bean file %s with %s transactions",
154
- target_file,
155
- len(change_set.add),
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
- bean_content = "\n\n".join(map(txn_to_text, change_set.add))
159
- new_tree = parser.parse(bean_content)
160
- else:
161
- env.logger.info(
162
- "Applying change sets (add=%s, update=%s, remove=%s, dangling=%s) with remove_dangling=%s to %s",
163
- len(change_set.add),
164
- len(change_set.update),
165
- len(change_set.remove),
166
- len(change_set.dangling),
167
- remove_dangling,
168
- target_file,
169
- )
170
- tree = parser.parse(target_file.read_text())
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
- with target_file.open("wt") as fo:
176
- formatter = Formatter()
177
- formatter.format(new_tree, fo)
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.1.1"
3
+ version = "3.2.0"
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 = "~=3.10"
6
+ requires-python = ">=3.10"
7
7
  readme = "README.md"
8
8
  license = "MIT"
9
9
  dependencies = [
@@ -24,7 +24,7 @@ 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>= 1.0.0, <2.0.0",
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",
@@ -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())