techui-builder 0.6.8a2__tar.gz → 0.7__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 (187) hide show
  1. techui_builder-0.7/.gitmodules +3 -0
  2. {techui_builder-0.6.8a2/src/techui_builder.egg-info → techui_builder-0.7}/PKG-INFO +16 -4
  3. {techui_builder-0.6.8a2 → techui_builder-0.7}/README.md +14 -2
  4. techui_builder-0.7/example/t01-services/services/bl01t-ea-ioc-01/config/fastcs.yaml +18 -0
  5. {techui_builder-0.6.8a2 → techui_builder-0.7}/example/t01-services/synoptic/techui.yaml +2 -0
  6. {techui_builder-0.6.8a2 → techui_builder-0.7}/pyproject.toml +3 -2
  7. techui_builder-0.7/src/techui_builder/__main__.py +69 -0
  8. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/_logger.py +4 -0
  9. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/_version.py +3 -3
  10. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/autofill.py +1 -1
  11. techui_builder-0.7/src/techui_builder/builder.py +238 -0
  12. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/generate.py +80 -108
  13. techui_builder-0.6.8a2/src/techui_builder/builder.py → techui_builder-0.7/src/techui_builder/generate_jsonmap.py +83 -246
  14. techui_builder-0.6.8a2/src/techui_builder/__main__.py → techui_builder-0.7/src/techui_builder/main_app.py +4 -66
  15. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/models.py +28 -5
  16. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/schema_generator.py +8 -0
  17. techui_builder-0.7/src/techui_builder/status.py +103 -0
  18. {techui_builder-0.6.8a2 → techui_builder-0.7/src/techui_builder.egg-info}/PKG-INFO +16 -4
  19. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder.egg-info/SOURCES.txt +8 -1
  20. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/conftest.py +135 -10
  21. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_autofiller.py +9 -9
  22. techui_builder-0.7/tests/test_builder.py +211 -0
  23. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_cli.py +67 -20
  24. techui_builder-0.7/tests/test_files/widget_custom_suffix.xml +22 -0
  25. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/widget_related.xml +2 -3
  26. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/widget_url_screen.xml +2 -1
  27. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_generate.py +106 -137
  28. techui_builder-0.7/tests/test_generate_jsonmap.py +414 -0
  29. techui_builder-0.7/tests/test_status.py +96 -0
  30. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_utils.py +2 -2
  31. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_validator.py +2 -2
  32. techui_builder-0.6.8a2/tests/test_builder.py +0 -598
  33. {techui_builder-0.6.8a2 → techui_builder-0.7}/.copier-answers.yml +0 -0
  34. {techui_builder-0.6.8a2 → techui_builder-0.7}/.devcontainer/devcontainer.json +0 -0
  35. {techui_builder-0.6.8a2 → techui_builder-0.7}/.devcontainer/install_lazygit.sh +0 -0
  36. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/CONTRIBUTING.md +0 -0
  37. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  38. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  39. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  40. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/dependabot.yml +0 -0
  41. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/pages/index.html +0 -0
  42. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/pages/make_switcher.py +0 -0
  43. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/_dist.yml +0 -0
  44. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/_docs.yml +0 -0
  45. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/_pypi.yml +0 -0
  46. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/_release.yml +0 -0
  47. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/_test.yml +0 -0
  48. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/_tox.yml +0 -0
  49. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/ci.yml +0 -0
  50. {techui_builder-0.6.8a2 → techui_builder-0.7}/.github/workflows/periodic.yml +0 -0
  51. {techui_builder-0.6.8a2 → techui_builder-0.7}/.gitignore +0 -0
  52. {techui_builder-0.6.8a2 → techui_builder-0.7}/.gitleaks.toml +0 -0
  53. {techui_builder-0.6.8a2 → techui_builder-0.7}/.pre-commit-config.yaml +0 -0
  54. {techui_builder-0.6.8a2 → techui_builder-0.7}/.python-version +0 -0
  55. {techui_builder-0.6.8a2 → techui_builder-0.7}/.vscode/extensions.json +0 -0
  56. {techui_builder-0.6.8a2 → techui_builder-0.7}/.vscode/launch.json +0 -0
  57. {techui_builder-0.6.8a2 → techui_builder-0.7}/.vscode/settings.json +0 -0
  58. {techui_builder-0.6.8a2 → techui_builder-0.7}/.vscode/tasks.json +0 -0
  59. {techui_builder-0.6.8a2 → techui_builder-0.7}/Dockerfile +0 -0
  60. {techui_builder-0.6.8a2 → techui_builder-0.7}/LICENSE +0 -0
  61. {techui_builder-0.6.8a2 → techui_builder-0.7}/catalog-info.yaml +0 -0
  62. {techui_builder-0.6.8a2 → techui_builder-0.7}/docs/conf.py +0 -0
  63. {techui_builder-0.6.8a2 → techui_builder-0.7}/example/t01-services/services/bl01t-mo-ioc-01/config/ioc.yaml +0 -0
  64. {techui_builder-0.6.8a2 → techui_builder-0.7}/example/t01-services/synoptic/index.bob +0 -0
  65. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/config/devsta.db +0 -0
  66. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/services/bl23b-di-mod-01/config/ioc.yaml +0 -0
  67. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/services/bl23b-di-mod-02/config/ioc.yaml +0 -0
  68. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/services/bl23b-di-uvcam-01/config/ioc.yaml +0 -0
  69. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/services/bl23b-di-uvcam-02/config/ioc.yaml +0 -0
  70. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/services/bl23b-mo-ioc-01/config/ioc.yaml +0 -0
  71. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/services/bl23b-va-ioc-01/config/ioc.yaml +0 -0
  72. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IMG1.bob +0 -0
  73. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IMG11.bob +0 -0
  74. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IMG12.bob +0 -0
  75. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IONP1.bob +0 -0
  76. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IONP11.bob +0 -0
  77. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IONP12.bob +0 -0
  78. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/IONP21.bob +0 -0
  79. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/JsonMap.json +0 -0
  80. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/M3.bob +0 -0
  81. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/MOD1.bob +0 -0
  82. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/MOD2.bob +0 -0
  83. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/PIRG1.bob +0 -0
  84. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/PIRG11.bob +0 -0
  85. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/PIRG12.bob +0 -0
  86. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/SPACE11.bob +0 -0
  87. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/index.bob +0 -0
  88. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/LICENSE +0 -0
  89. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/ADAravis_detail.bob +0 -0
  90. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/ADAravis_summary.bob +0 -0
  91. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/NDFileHDF5.pvi.bob +0 -0
  92. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/NDPluginPva.pvi.bob +0 -0
  93. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/NDPluginROI.pvi.bob +0 -0
  94. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/NDPluginROIStat.pvi.bob +0 -0
  95. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/NDPluginStats.pvi.bob +0 -0
  96. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/ADAravis/ProfileCursorGraphs.bob +0 -0
  97. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/colour.def +0 -0
  98. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/digitelMpc/digitelMpcIonp.bob +0 -0
  99. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/dls_class.bcf +0 -0
  100. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/mks937a/mks937a.bob +0 -0
  101. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/mks937a/mks937aGauge.bob +0 -0
  102. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/mks937a/mks937aImg.bob +0 -0
  103. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/mks937a/mks937aPirg.bob +0 -0
  104. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/pmac/MOTOR.bob +0 -0
  105. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/pmac/motor_embed.bob +0 -0
  106. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/pmac/pmacController.bob +0 -0
  107. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/pmac/ppmacController.bob +0 -0
  108. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/rga/rga.bob +0 -0
  109. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/settings.ini +0 -0
  110. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/vacuumValve/vacuumValve.bob +0 -0
  111. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/bob/vacuumValve/vacuumValveInterlocks.bob +0 -0
  112. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/3DCM_diag_3.gif +0 -0
  113. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/Beamline_Image.png +0 -0
  114. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/Beamline_Image_Colour.png +0 -0
  115. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/Panda.jpg +0 -0
  116. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/WoodenArch.jpg +0 -0
  117. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/absorber 1 (copy).svg +0 -0
  118. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/absorber 1.svg +0 -0
  119. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/aperture.svg +0 -0
  120. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/camera +0 -0
  121. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/camera-1.svg +0 -0
  122. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/dcm.svg +0 -0
  123. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/diag-stick-camera.svg +0 -0
  124. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/diag-stick-camera_flipped.png +0 -0
  125. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/diag-stick.svg +0 -0
  126. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/fastValve 1 (copy).svg +0 -0
  127. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/fastValve 1.svg +0 -0
  128. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/floodgate.jpg +0 -0
  129. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/fm.png +0 -0
  130. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/fm.svg +0 -0
  131. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/fvg 0.svg +0 -0
  132. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/hfm.svg +0 -0
  133. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/img 0 (copy).svg +0 -0
  134. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/img 0.svg +0 -0
  135. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/ionp 4 (another copy).svg +0 -0
  136. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/ionp 4 (copy).svg +0 -0
  137. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/ionp 4.svg +0 -0
  138. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/manualValve 1 (copy).svg +0 -0
  139. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/manualValve 1.svg +0 -0
  140. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/motors +0 -0
  141. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/pirg 0 (copy).svg +0 -0
  142. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/pirg 0.svg +0 -0
  143. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/rga 0.svg +0 -0
  144. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/ring 0.svg +0 -0
  145. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/ring 1.png +0 -0
  146. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/ring 1.svg +0 -0
  147. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/shutter 1 (copy).svg +0 -0
  148. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/shutter 1.svg +0 -0
  149. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/shutter 2.svg +0 -0
  150. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/shutter 3.svg +0 -0
  151. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/slits.svg +0 -0
  152. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/space 0.svg +0 -0
  153. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/spacenew 0.svg +0 -0
  154. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/table.png +0 -0
  155. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/valve 1 (copy).svg +0 -0
  156. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/valve 1.svg +0 -0
  157. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/vfm-up.svg +0 -0
  158. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/webcam.png +0 -0
  159. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/symbols/webcam.svg +0 -0
  160. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui-support/techui-support.yaml +0 -0
  161. {techui_builder-0.6.8a2 → techui_builder-0.7}/example-synoptic/b23-services/synoptic/techui.yaml +0 -0
  162. {techui_builder-0.6.8a2 → techui_builder-0.7}/setup.cfg +0 -0
  163. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/__init__.py +0 -0
  164. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/utils.py +0 -0
  165. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder/validator.py +0 -0
  166. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder.egg-info/dependency_links.txt +0 -0
  167. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder.egg-info/entry_points.txt +0 -0
  168. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder.egg-info/requires.txt +0 -0
  169. {techui_builder-0.6.8a2 → techui_builder-0.7}/src/techui_builder.egg-info/top_level.txt +0 -0
  170. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/__init__.py +0 -0
  171. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/group.xml +0 -0
  172. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/index.bob +0 -0
  173. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/motor-edited.bob +0 -0
  174. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/motor.bob +0 -0
  175. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/motor_bad.bob +0 -0
  176. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/motor_embed.bob +0 -0
  177. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/test_bob.bob +0 -0
  178. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/test_bob_bad.bob +0 -0
  179. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/test_bob_embedded.bob +0 -0
  180. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/test_bob_navtabs.bob +0 -0
  181. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/widget.xml +0 -0
  182. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/widget_bad.xml +0 -0
  183. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/widget_bad_2.xml +0 -0
  184. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_files/widget_related_no_suffix.xml +0 -0
  185. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_logger.py +0 -0
  186. {techui_builder-0.6.8a2 → techui_builder-0.7}/tests/test_models.py +0 -0
  187. {techui_builder-0.6.8a2 → techui_builder-0.7}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ [submodule "example/t01-services/synoptic/techui-support"]
2
+ path = example/t01-services/synoptic/techui-support
3
+ url = https://github.com/DiamondLightSource/techui-support.git
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: techui-builder
3
- Version: 0.6.8a2
3
+ Version: 0.7
4
4
  Summary: A package for building Phoebus GUIs
5
- Author-email: Oliver Copping <oliver.copping@diamond.ac.uk>, Adedamola Sode <adedamola.sode@diamond.ac.uk>, Niamh Dougan <niamh.dougan@diamond.ac.uk>
5
+ Author-email: Oliver Copping <oliver.copping@diamond.ac.uk>, Adedamola Sode <adedamola.sode@diamond.ac.uk>, Niamh Dougan <niamh.dougan@diamond.ac.uk>, Thomas Kane <thomas.kane@diamond.ac.uk>
6
6
  Project-URL: GitHub, https://github.com/DiamondLightSource/techui-builder
7
7
  Classifier: Development Status :: 3 - Alpha
8
8
  Classifier: Programming Language :: Python :: 3.12
@@ -75,7 +75,7 @@ The process to use this module goes as follows (WIP):
75
75
  > `extras` is optional, but allows any embedded screen to be added to make a summary screen e.g. combining all imgs, pirgs and ionps associated with a vacuum space.
76
76
  1. Run this command to locally generate a schema, which can be used for validation testing
77
77
 
78
- ```$ techui-builder --schema```
78
+ ```$ techui-builder schema```
79
79
 
80
80
  Add the following at the top of the `techui.yaml` to validate it against a schema
81
81
 
@@ -85,10 +85,22 @@ The process to use this module goes as follows (WIP):
85
85
 
86
86
  ## Generating the Synoptic
87
87
 
88
- `$ techui-builder /path/to/synoptic/techui.yaml`
88
+ `$ techui-builder build /path/to/synoptic/techui.yaml`
89
89
 
90
90
  This populates `index.bob` and individual component screens inside `ixx-services/synoptic`.
91
91
 
92
+ ## Generating the JsonMap
93
+
94
+ `$ techui-builder generate-jsonmap /path/to/synoptic/index.bob`
95
+
96
+ This populates `JsonMap.json` with the tree of component screens inside `ixx-services/synoptic/index.bob`.
97
+
98
+ ## Generating the Status PV database file
99
+
100
+ `$ techui-builder status /path/to/synoptic/techui.yaml`
101
+
102
+ This populates `config/status.db` with the status PVs of components inside `ixx-services/synoptic/techui.yaml`.
103
+
92
104
  ## Viewing the Synoptic
93
105
 
94
106
  In a terminal outside of the container:
@@ -53,7 +53,7 @@ The process to use this module goes as follows (WIP):
53
53
  > `extras` is optional, but allows any embedded screen to be added to make a summary screen e.g. combining all imgs, pirgs and ionps associated with a vacuum space.
54
54
  1. Run this command to locally generate a schema, which can be used for validation testing
55
55
 
56
- ```$ techui-builder --schema```
56
+ ```$ techui-builder schema```
57
57
 
58
58
  Add the following at the top of the `techui.yaml` to validate it against a schema
59
59
 
@@ -63,10 +63,22 @@ The process to use this module goes as follows (WIP):
63
63
 
64
64
  ## Generating the Synoptic
65
65
 
66
- `$ techui-builder /path/to/synoptic/techui.yaml`
66
+ `$ techui-builder build /path/to/synoptic/techui.yaml`
67
67
 
68
68
  This populates `index.bob` and individual component screens inside `ixx-services/synoptic`.
69
69
 
70
+ ## Generating the JsonMap
71
+
72
+ `$ techui-builder generate-jsonmap /path/to/synoptic/index.bob`
73
+
74
+ This populates `JsonMap.json` with the tree of component screens inside `ixx-services/synoptic/index.bob`.
75
+
76
+ ## Generating the Status PV database file
77
+
78
+ `$ techui-builder status /path/to/synoptic/techui.yaml`
79
+
80
+ This populates `config/status.db` with the status PVs of components inside `ixx-services/synoptic/techui.yaml`.
81
+
70
82
  ## Viewing the Synoptic
71
83
 
72
84
  In a terminal outside of the container:
@@ -0,0 +1,18 @@
1
+ # yaml-language-server: $schema=schema.json
2
+ controllers:
3
+ - name: BL01T-EA-TEST-01
4
+ type: fastcs.TemperatureController
5
+ ip_settings:
6
+ ip: "localhost"
7
+ port: 25565
8
+ num_ramp_controllers: 4
9
+
10
+ transport:
11
+ - graphql:
12
+ host: localhost
13
+ port: 8083
14
+ log_level: info
15
+ - epicsca: {}
16
+ gui:
17
+ title: Temperature Controller Demo
18
+ output_dir: .
@@ -9,6 +9,8 @@ components:
9
9
  fshtr:
10
10
  label: Fast Shutter
11
11
  prefix: BL01T-EA-FSHTR-01
12
+ status:
13
+ - BL01T-EA-FSHTR-01:FSHTR1.STAT
12
14
 
13
15
  d1:
14
16
  label: Diode 1
@@ -3,6 +3,8 @@ requires = ["setuptools>=64", "setuptools_scm[toml]>=8"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
+ scripts = { techui-builder = "techui_builder.__main__:app" }
7
+
6
8
  name = "techui-builder"
7
9
  dynamic = ["version"]
8
10
  description = "A package for building Phoebus GUIs"
@@ -16,6 +18,7 @@ authors = [
16
18
  { name = "Oliver Copping", email = "oliver.copping@diamond.ac.uk" },
17
19
  { name = "Adedamola Sode", email = "adedamola.sode@diamond.ac.uk" },
18
20
  { name = "Niamh Dougan", email = "niamh.dougan@diamond.ac.uk" },
21
+ { name = "Thomas Kane", email = "thomas.kane@diamond.ac.uk" },
19
22
  ]
20
23
  license-files = ["LICENSE"]
21
24
  readme = "README.md"
@@ -30,8 +33,6 @@ dependencies = [
30
33
  "softioc>=4.7.0",
31
34
  "epicsdbbuilder>=1.5",
32
35
  ]
33
- scripts = { techui-builder = "techui_builder.__main__:app" }
34
-
35
36
  [dependency-groups]
36
37
  dev = [
37
38
  "copier",
@@ -0,0 +1,69 @@
1
+ """Interface for ``python -m techui_builder``."""
2
+
3
+ import logging
4
+
5
+ import typer
6
+
7
+ from techui_builder._version import __version__
8
+ from techui_builder.generate_jsonmap import app as generate_jsonmap_app
9
+ from techui_builder.main_app import app as main_app
10
+ from techui_builder.schema_generator import app as schema_app
11
+ from techui_builder.status import app as status_app
12
+
13
+ logger_ = logging.getLogger(__name__)
14
+
15
+ app = typer.Typer(
16
+ pretty_exceptions_show_locals=False,
17
+ context_settings={"allow_interspersed_args": True},
18
+ help="""
19
+ A script for building Phoebus GUIs.
20
+
21
+ This is the required file structure:\n
22
+ \n
23
+ ixx-services\n
24
+ |-- services\n
25
+ | |-- blxxi-ea-device-01\n
26
+ | | `-- config\n
27
+ | | `-- ioc.yaml\n
28
+ | |-- ...\n
29
+ | `-- blxxi-va-device-01\n
30
+ | `-- config\n
31
+ | `-- ioc.yaml\n
32
+ `-- synoptic\n
33
+ . |-- techui-support/\n
34
+ | | `-- ...\n
35
+ . |-- techui.yaml\n
36
+ . `-- index.bob\n
37
+ """,
38
+ no_args_is_help=True,
39
+ )
40
+
41
+
42
+ def version_callback(value: bool):
43
+ if value:
44
+ print(f"techui-builder version: {__version__}")
45
+ raise typer.Exit()
46
+
47
+
48
+ @app.callback()
49
+ def _(
50
+ version: bool = typer.Option(
51
+ False,
52
+ "--version",
53
+ callback=version_callback,
54
+ is_eager=True,
55
+ help="Show version of techui-builder and exit",
56
+ ),
57
+ ):
58
+ """Boilerplate callback function to allow for --version CLI option"""
59
+ pass
60
+
61
+
62
+ app.add_typer(main_app)
63
+ app.add_typer(schema_app, name="schema")
64
+ app.add_typer(generate_jsonmap_app, name="generate-jsonmap")
65
+ app.add_typer(status_app, name="status")
66
+
67
+
68
+ if __name__ == "__main__":
69
+ app()
@@ -16,3 +16,7 @@ class Logger:
16
16
  format="%(message)s",
17
17
  handlers=[self.handler],
18
18
  )
19
+
20
+
21
+ def log_level(level: str):
22
+ Logger(level)
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.6.8a2'
22
- __version_tuple__ = version_tuple = (0, 6, 8, 'a2')
21
+ __version__ = version = '0.7'
22
+ __version_tuple__ = version_tuple = (0, 7)
23
23
 
24
- __commit_id__ = commit_id = 'gd10e2d23d'
24
+ __commit_id__ = commit_id = 'ga46847b35'
@@ -8,7 +8,7 @@ from lxml import objectify
8
8
  from lxml.etree import Element, SubElement, tostring
9
9
  from lxml.objectify import ObjectifiedElement, fromstring
10
10
 
11
- from techui_builder.builder import _get_action_group
11
+ from techui_builder.generate_jsonmap import _get_action_group
12
12
  from techui_builder.models import Component
13
13
  from techui_builder.utils import read_bob
14
14
 
@@ -0,0 +1,238 @@
1
+ import logging
2
+ import os
3
+ import re
4
+ from collections import defaultdict
5
+ from dataclasses import dataclass, field
6
+ from pathlib import Path
7
+
8
+ import yaml
9
+ from jinja2 import Template
10
+
11
+ from techui_builder.generate import Generator
12
+ from techui_builder.models import Entity, SupportEntity, TechUi, TechUiSupport
13
+ from techui_builder.validator import Validator
14
+
15
+ logger_ = logging.getLogger(__name__)
16
+
17
+
18
+ @dataclass
19
+ class Builder:
20
+ """
21
+ This class provides the functionality to process the required
22
+ techui.yaml file into screens mapped from ioc.yaml and
23
+ *-mapping.yaml files.
24
+
25
+ By default it looks for a `techui.yaml` file in the same dir
26
+ of the script Guibuilder is called in. Optionally a custom path
27
+ can be declared.
28
+
29
+ """
30
+
31
+ techui: Path = field(default=Path("techui.yaml"))
32
+
33
+ entities: defaultdict[str, list[Entity]] = field(
34
+ default_factory=lambda: defaultdict(list), init=False
35
+ )
36
+ _services_dir: Path = field(init=False, repr=False)
37
+ _write_directory: Path = field(init=False, repr=False)
38
+
39
+ def __post_init__(self):
40
+ # Populate beamline and components
41
+ self.conf = TechUi.model_validate(
42
+ yaml.safe_load(self.techui.read_text(encoding="utf-8"))
43
+ )
44
+
45
+ def setup(self):
46
+ """
47
+ Run intial setup, e.g. extracting entries
48
+ from service ioc.yaml or fastcs.yaml.
49
+ """
50
+ # This needs to be before _read_map()
51
+ self.support_path = self._write_directory.joinpath("techui-support")
52
+
53
+ self._read_map()
54
+
55
+ self._extract_services()
56
+
57
+ self.clean_files()
58
+
59
+ self.generator = Generator(
60
+ self._write_directory,
61
+ self.conf.beamline.url,
62
+ self.support_path,
63
+ self.techui_support,
64
+ )
65
+
66
+ def _read_map(self):
67
+ """Read the techui-support.yaml file from techui-support."""
68
+ support_yaml = self.support_path.joinpath("techui-support.yaml").absolute()
69
+ logger_.debug(f"techui-support.yaml location: {support_yaml}")
70
+
71
+ self.techui_support = TechUiSupport.model_validate(
72
+ yaml.safe_load(support_yaml.read_text(encoding="utf-8"))
73
+ )
74
+
75
+ def clean_files(self):
76
+ exclude = {"index.bob"}
77
+ bobs = [
78
+ bob
79
+ for bob in self._write_directory.glob("*.bob")
80
+ if bob.name not in exclude
81
+ ]
82
+
83
+ self.validator = Validator(bobs)
84
+ self.validator.check_bobs()
85
+
86
+ # Get bobs that are only present in the bobs list (i.e. generated)
87
+ self.generated_bobs = list(set(bobs) ^ set(self.validator.validate.values()))
88
+
89
+ logger_.info("Preserving edited screens for validation.")
90
+ logger_.debug(f"Screens to validate: {list(self.validator.validate.keys())}")
91
+
92
+ logger_.info("Cleaning synoptic/ of generated screens.")
93
+
94
+ try:
95
+ # Find the JsonMap file
96
+ json_map_file = next(self._write_directory.glob("JsonMap.json"))
97
+ # If it exists, we want to remove it too
98
+ generated_files = [*self.generated_bobs, json_map_file]
99
+ except StopIteration:
100
+ generated_files = self.generated_bobs
101
+
102
+ # Remove any generated files that exist
103
+ for file_ in generated_files:
104
+ logger_.debug(f"Removing generated file: {file_.name}")
105
+ os.remove(file_)
106
+
107
+ def _extract_services(self):
108
+ """
109
+ Finds the services folders in the services directory
110
+ and extracts all entites
111
+ """
112
+
113
+ # Loop over every dir in services, ignoring anything that isn't a service
114
+ for service in self._services_dir.glob(f"{self.conf.beamline.domain}-*-*-*"):
115
+ service_name = service.name
116
+ # If service doesn't exist, file open will fail throwing exception
117
+ try:
118
+ service_yaml_dir = service.joinpath("config")
119
+ service_yaml = next(service_yaml_dir.glob("*.yaml"), None)
120
+ if service_yaml is None:
121
+ raise OSError()
122
+
123
+ self._extract_entities(
124
+ service_name=service_name,
125
+ service_yaml=service_yaml,
126
+ )
127
+
128
+ except OSError:
129
+ logger_.error(
130
+ "No ioc.yaml or fastcs.yaml found for service: "
131
+ f"[bold]{service_name}[/bold]. Does it exist?"
132
+ )
133
+
134
+ def _extract_entities(self, service_name: str, service_yaml: Path):
135
+ """
136
+ Extracts the entries in ioc.yaml matching the defined prefix
137
+ """
138
+
139
+ with open(service_yaml) as ioc:
140
+ ioc_conf: dict[str, list[dict[str, str]]] = yaml.safe_load(ioc)
141
+
142
+ for key in ioc_conf.keys():
143
+ _regex = re.compile(r"^(?:(entities)|(controllers))$")
144
+ match = _regex.match(key)
145
+ if match:
146
+ entity_key = match.group()
147
+
148
+ for entity in ioc_conf[entity_key]:
149
+ if entity["type"] in self.techui_support.support_modules:
150
+ support_mapping: SupportEntity = (
151
+ self.techui_support.support_modules[entity["type"]]
152
+ )
153
+ support_macros = support_mapping.macros
154
+
155
+ macros = {
156
+ k: v for k, v in entity.items() if k in support_macros
157
+ }
158
+
159
+ prefix_template = Template(support_mapping.prefix)
160
+ prefix: str = prefix_template.render(macros)
161
+
162
+ # Create Entity and append to entity list
163
+ new_entity = Entity(
164
+ service_name=service_name,
165
+ type=entity["type"],
166
+ desc=entity.get("desc", None),
167
+ prefix=prefix,
168
+ macros=macros,
169
+ )
170
+
171
+ pv_root = prefix.split(":", maxsplit=1)[0]
172
+ self.entities[pv_root].append(new_entity)
173
+ break
174
+
175
+ def _generate_screen(self, screen_name: str):
176
+ self.generator.build_screen(screen_name)
177
+ self.generator.write_screen(screen_name, self._write_directory)
178
+
179
+ def _validate_screen(self, screen_name: str):
180
+ # Get the generated widgets to validate against
181
+ widgets = self.generator.widgets
182
+ widget_group = self.generator.group
183
+ assert widget_group is not None
184
+ widget_group_name = widget_group.get_element_value("name")
185
+ self.validator.validate_bob(screen_name, widget_group_name, widgets)
186
+
187
+ def create_screens(self):
188
+ """Create the screens for each component in techui.yaml"""
189
+ if len(self.entities) == 0:
190
+ logger_.critical(
191
+ "No ioc entities found. This [italic]normally[/italic]"
192
+ " suggests an issue with finding ixx-services."
193
+ )
194
+ exit()
195
+
196
+ # Loop over every component defined in techui.yaml and locate
197
+ # any extras defined
198
+ for component_name, component in self.conf.components.items():
199
+ screen_entities: list[Entity] = []
200
+
201
+ # ONLY IF there is a matching component and entity, generate a screen
202
+ if component.prefix in self.entities.keys():
203
+ # Populate child labels for any entities
204
+ # with the same prefix as the component
205
+ for entity in self.entities[component.prefix]:
206
+ entity.child_labels = component.child_labels
207
+
208
+ screen_entities.extend(self.entities[component.prefix])
209
+
210
+ if component.extras is not None:
211
+ # If component has any extras, add them to the entries to generate
212
+ for extra_p in component.extras:
213
+ if extra_p not in self.entities.keys():
214
+ logger_.error(
215
+ f"Extra prefix {extra_p} for {component_name} does not"
216
+ " exist."
217
+ )
218
+ continue
219
+ screen_entities.extend(self.entities[extra_p])
220
+
221
+ # This is used by both generate and validate,
222
+ # so called beforehand for tidyness
223
+ self.generator.build_widgets(component_name, screen_entities)
224
+ self.generator.build_groups(component_name, self.conf.components)
225
+
226
+ screens_to_validate = list(self.validator.validate.keys())
227
+
228
+ if component_name in screens_to_validate:
229
+ self._validate_screen(component_name)
230
+ else:
231
+ self._generate_screen(component_name)
232
+
233
+ else:
234
+ logger_.warning(
235
+ f"{self.techui.name}: The prefix [bold]{component.prefix}[/bold] "
236
+ f"set in the component [bold]{component_name}[/bold] does not match"
237
+ " any P field in the ioc.yaml files in services"
238
+ )