LbAPLocal 0.9.8__tar.gz → 0.9.10__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 (144) hide show
  1. lbaplocal-0.9.10/PKG-INFO +163 -0
  2. lbaplocal-0.9.10/README.md +126 -0
  3. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/pyproject.toml +3 -1
  4. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cli/main.py +230 -30
  5. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cwl/generate_replica_map.py +35 -0
  6. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/job_slice.py +68 -2
  7. lbaplocal-0.9.10/src/LbAPLocal/log_parsing.py +333 -0
  8. lbaplocal-0.9.10/src/LbAPLocal.egg-info/PKG-INFO +163 -0
  9. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal.egg-info/requires.txt +0 -1
  10. lbaplocal-0.9.10/tests/test_log_parse.py +91 -0
  11. lbaplocal-0.9.8/PKG-INFO +0 -207
  12. lbaplocal-0.9.8/README.md +0 -169
  13. lbaplocal-0.9.8/src/LbAPLocal/log_parsing.py +0 -84
  14. lbaplocal-0.9.8/src/LbAPLocal.egg-info/PKG-INFO +0 -207
  15. lbaplocal-0.9.8/tests/test_log_parse.py +0 -33
  16. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/.coveragerc +0 -0
  17. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/.gitattributes +0 -0
  18. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/.gitignore +0 -0
  19. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/.gitlab-ci.yml +0 -0
  20. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/.pre-commit-config.yaml +0 -0
  21. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/CONTRIBUTING.md +0 -0
  22. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/LICENSE +0 -0
  23. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/example.json +0 -0
  24. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/setup.cfg +0 -0
  25. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/__init__.py +0 -0
  26. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cli/__init__.py +0 -0
  27. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cli/legacy.py +0 -0
  28. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cli/textual_ui.py +0 -0
  29. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cli/wizards.py +0 -0
  30. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cwl/__init__.py +0 -0
  31. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/cwl/rewrite.py +0 -0
  32. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/testing.py +0 -0
  33. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal/utils.py +0 -0
  34. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal.egg-info/SOURCES.txt +0 -0
  35. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal.egg-info/dependency_links.txt +0 -0
  36. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal.egg-info/entry_points.txt +0 -0
  37. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/src/LbAPLocal.egg-info/top_level.txt +0 -0
  38. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/capture_fixtures.py +0 -0
  39. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/cassettes/test_execute/test_run_test[2016_MagDown_PromptMC_D02KK-2444].yaml +0 -0
  40. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/cassettes/test_execute/test_run_test[2016_MagDown_PromptMC_D02KK_noautoconf-2444].yaml +0 -0
  41. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/cassettes/test_execute/test_run_test[2016_MagUp_PromptMC_D02KK-2393].yaml +0 -0
  42. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/cassettes/test_execute/test_run_test[2016_MagUp_PromptMC_D02KK_noautoconf-2393].yaml +0 -0
  43. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/conftest.py +0 -0
  44. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/.gitignore +0 -0
  45. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/.gitlab-ci.yml +0 -0
  46. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/AnalysisProductions.xenv +0 -0
  47. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bc2Bspi2JpsiPhi.py +0 -0
  48. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bd2JpsiKstar.py +0 -0
  49. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bd2JpsiKstar_stripping.py +0 -0
  50. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2DsPi.py +0 -0
  51. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi.py +0 -0
  52. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi_Prompt.py +0 -0
  53. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi_Prompt_PVMixer.py +0 -0
  54. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi_Swave.py +0 -0
  55. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bu2JpsiKplus.py +0 -0
  56. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/Bu2JpsiKplus_stripping.py +0 -0
  57. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/LbJpsipK.py +0 -0
  58. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/README.md +0 -0
  59. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/helpers/__init__.py +0 -0
  60. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/helpers/stripping.py +0 -0
  61. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/helpers/tuple_maker.py +0 -0
  62. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/info.yaml +0 -0
  63. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/BsToJpsiPhi/sequence_setup.py +0 -0
  64. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/COPYING +0 -0
  65. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/RDs/README.md +0 -0
  66. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/RDs/Run1_Signal.py +0 -0
  67. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/RDs/Run2_Signal.py +0 -0
  68. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/RDs/helpers/__init__.py +0 -0
  69. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/RDs/helpers/signal_tuple_maker.py +0 -0
  70. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/RDs/info.yaml +0 -0
  71. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/README.md +0 -0
  72. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/__init__.py +0 -0
  73. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/2011_datatype.py +0 -0
  74. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/2012_datatype.py +0 -0
  75. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/2015_datatype.py +0 -0
  76. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/2016_datatype.py +0 -0
  77. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/2017_datatype.py +0 -0
  78. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/2018_datatype.py +0 -0
  79. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/B0ToK0ee.py +0 -0
  80. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/B0ToK0mumu.py +0 -0
  81. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/BpToKee.py +0 -0
  82. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/BpToKmumu.py +0 -0
  83. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/LbToL0ee.py +0 -0
  84. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/LbToL0eeSS.py +0 -0
  85. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/LbToL0emu.py +0 -0
  86. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/LbToL0emuSS.py +0 -0
  87. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/LbToL0mumu.py +0 -0
  88. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/LbToL0mumuSS.py +0 -0
  89. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/README.md +0 -0
  90. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/__init__.py +0 -0
  91. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/general_options.py +0 -0
  92. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/MC_tuple_maker.py +0 -0
  93. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/__init__.py +0 -0
  94. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/decay_descriptors.py +0 -0
  95. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/locations.py +0 -0
  96. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/related_info.py +0 -0
  97. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/stripping.py +0 -0
  98. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/tags.py +0 -0
  99. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/helpers/tuple_maker.py +0 -0
  100. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/info.yaml +0 -0
  101. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_general_options_DST.py +0 -0
  102. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_general_options_FDST.py +0 -0
  103. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_general_options_FMDST.py +0 -0
  104. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_general_options_MDST.py +0 -0
  105. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2JpsiKs_ee.py +0 -0
  106. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2JpsiKs_mm.py +0 -0
  107. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2Ksee.py +0 -0
  108. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2Ksmm.py +0 -0
  109. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2PsiKs_ee.py +0 -0
  110. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2PsiKs_mm.py +0 -0
  111. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bu2JpsiK_ee.py +0 -0
  112. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bu2JpsiK_mm.py +0 -0
  113. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2JpsiL_ee.py +0 -0
  114. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2JpsiL_mm.py +0 -0
  115. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2Lee.py +0 -0
  116. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2Lem.py +0 -0
  117. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2Lmm.py +0 -0
  118. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2PsiL_ee.py +0 -0
  119. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2PsiL_mm.py +0 -0
  120. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/sequence_setup.py +0 -0
  121. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/cbtesting/stripping_seq.py +0 -0
  122. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/executabletests/2016_MagDown_PromptMC_D02KK_autoconf.py +0 -0
  123. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/executabletests/2016_MagUp_PromptMC_D02KK_autoconf.py +0 -0
  124. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/executabletests/info.yaml +0 -0
  125. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/data-pkg-repo/executabletests/ntuple_options.py +0 -0
  126. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/error-failed-to-read-file.log +0 -0
  127. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/error-illegal-instruction.log +0 -0
  128. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/error-missing-shared-library.log +0 -0
  129. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/error-platform-unsupported.log +0 -0
  130. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/error-related-info-missing.log +0 -0
  131. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/good-DaVinci_00110296_00000038_1.log +0 -0
  132. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/good-DaVinci_00110296_00000194_1.log +0 -0
  133. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/data/example-logs/good-Gauss_00104988_00000011_1.log +0 -0
  134. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/fixture_loader.py +0 -0
  135. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/fixtures/executabletests/2016_MagDown_PromptMC_D02KK/query_result.json +0 -0
  136. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/fixtures/executabletests/2016_MagUp_PromptMC_D02KK/query_result.json +0 -0
  137. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/fixtures/executabletests/manifest.yaml +0 -0
  138. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/reslice_fixture.py +0 -0
  139. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/test-input-dst/00070767_00000711_7.AllStreams_slice.dst +0 -0
  140. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/test-input-dst/00070793_00000685_7.AllStreams_slice.dst +0 -0
  141. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/test_cli.py +0 -0
  142. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/test_cwl_cli.py +0 -0
  143. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/test_execute.py +0 -0
  144. {lbaplocal-0.9.8 → lbaplocal-0.9.10}/tests/test_local_datapkg.py +0 -0
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: LbAPLocal
3
+ Version: 0.9.10
4
+ Summary: Tool to locally run tests for AnalysisProductions
5
+ Author: LHCb
6
+ Project-URL: Homepage, https://gitlab.cern.ch/lhcb-dpa/analysis-productions/lbaplocal
7
+ Project-URL: Bug Reports, https://gitlab.cern.ch/lhcb-dpa/analysis-productions/lbaplocal/-/issues
8
+ Project-URL: Source, https://gitlab.cern.ch/lhcb-dpa/analysis-productions/lbaplocal
9
+ Keywords: LHCb AnalysisProductions DIRAC
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.12
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: LbAPCommon>=0.15.10
17
+ Requires-Dist: LbProdRun>1.12.2
18
+ Requires-Dist: dirac-cwl>=1.1.3
19
+ Requires-Dist: LbDiracWrappers
20
+ Requires-Dist: LbEnv
21
+ Requires-Dist: apd>=0.6.0
22
+ Requires-Dist: click
23
+ Requires-Dist: mplhep
24
+ Requires-Dist: requests
25
+ Requires-Dist: setuptools
26
+ Requires-Dist: packaging
27
+ Requires-Dist: typer
28
+ Requires-Dist: rich
29
+ Requires-Dist: textual
30
+ Provides-Extra: testing
31
+ Requires-Dist: pytest; extra == "testing"
32
+ Requires-Dist: pytest-cov; extra == "testing"
33
+ Requires-Dist: pytest-mock; extra == "testing"
34
+ Requires-Dist: pytest-recording; extra == "testing"
35
+ Requires-Dist: pytest-timeout; extra == "testing"
36
+ Dynamic: license-file
37
+
38
+ # LbAPLocal
39
+
40
+ LbAPLocal is the Python library and CLI for running offline tests for the LHCb AnalysisProductions framework.
41
+
42
+ ## Installation
43
+
44
+ LbAPLocal is installed by default with the LHCb environment on lxplus. For users on external clusters, source the LHCb environment from CVMFS:
45
+
46
+ ```bash
47
+ source /cvmfs/lhcb.cern.ch/lib/LbEnv
48
+ ```
49
+
50
+ ## Usage
51
+
52
+ ```
53
+ Usage: lb-ap [OPTIONS] COMMAND [ARGS]...
54
+
55
+ CLI for LHCb AnalysisProductions
56
+
57
+ Options:
58
+ -C, --change-dir PATH Change to this directory before running
59
+ -b, --branch TEXT Branch or tag to use
60
+ -v, --verbose Enable verbose output
61
+ --version Show version and exit
62
+ --help Show this message and exit
63
+
64
+ Commands:
65
+ versions List available tags of the Analysis Productions repository
66
+ clone Clone the AnalysisProductions repository
67
+ checkout Check out a branch or tag
68
+ list List available productions and jobs
69
+ test Test a job using CWL workflow
70
+ parse-log Analyse a Gaudi log file and show a summary with advice
71
+ make-reproducer Create a minimal reproducer from a failed grid job
72
+ cwl CWL-based workflow commands (generate, run, validate, test)
73
+ ```
74
+
75
+ ### Testing a job
76
+
77
+ The primary command. Generates a CWL workflow from the production configuration and executes it locally:
78
+
79
+ ```bash
80
+ lb-ap test MyAnalysis My2016MagDownJob
81
+ ```
82
+
83
+ Key options:
84
+
85
+ ```bash
86
+ lb-ap test MyAnalysis MyJob -i /path/to/input.dst # Use a specific input file
87
+ lb-ap test MyAnalysis MyJob -n 100 # Slice input to 100 events
88
+ lb-ap test MyAnalysis MyJob --n-lfns 5 # Test with 5 input LFNs
89
+ lb-ap test MyAnalysis MyJob --pick-smallest-lfn # Use smallest LFN for speed
90
+ lb-ap test MyAnalysis MyJob --download # Download input files locally
91
+ lb-ap test MyAnalysis MyJob --pretty # Real-time TUI monitoring
92
+ lb-ap test MyAnalysis MyJob --dry-run # Validate without executing
93
+ lb-ap test MyAnalysis MyJob -o ./output # Custom output directory
94
+ ```
95
+
96
+ If arguments are omitted, an interactive wizard guides you through the setup.
97
+
98
+ The `-n <N>` flag slices the input file to N events using `GaudiConf.mergeDST:dst` (remote read, local write). After slicing, a reuse hint is printed so subsequent runs can skip the slicing step by passing the sliced file with `-i`.
99
+
100
+ ### Custom input files
101
+
102
+ When testing a job that depends on another job, pass the upstream output with `-i`:
103
+
104
+ ```bash
105
+ lb-ap test MyAnalysis MyDownstreamJob -i /path/to/upstream_output.dst
106
+ ```
107
+
108
+ The input can be a local file path or an LFN (`LFN:/lhcb/...`).
109
+
110
+ ### Analysing log files
111
+
112
+ Parse a Gaudi log file for FATAL, ERROR, and WARNING messages with contextual advice:
113
+
114
+ ```bash
115
+ lb-ap parse-log DaVinci_00012345_00006789_1.log
116
+ ```
117
+
118
+ Log analysis is also integrated into `lb-ap test` — after a test completes (success or failure), any Gaudi log files in the output are automatically analysed and a summary is displayed.
119
+
120
+ ### Listing productions and jobs
121
+
122
+ ```bash
123
+ lb-ap list # List available productions
124
+ lb-ap list MyAnalysis # List jobs in a production
125
+ lb-ap list --tree # Tree view of all productions and jobs
126
+ ```
127
+
128
+ ### Repository management
129
+
130
+ ```bash
131
+ lb-ap clone --protocol ssh # Clone AnalysisProductions
132
+ lb-ap checkout v1r4315 # Check out a version
133
+ lb-ap versions MyAnalysis # List available versions
134
+ ```
135
+
136
+ ### Creating a minimal reproducer
137
+
138
+ From a failed grid job, create a self-contained reproducer package:
139
+
140
+ ```bash
141
+ lb-ap make-reproducer 12345678 # From DIRAC job ID
142
+ lb-ap make-reproducer --job-dir ./downloaded_job_dir # From local job directory
143
+ ```
144
+
145
+ ## Development
146
+
147
+ **Platform:** pixi targets `linux-64` only (requires CERN CVMFS and DIRAC).
148
+
149
+ ```bash
150
+ # On linux-64 (lxplus or CI):
151
+ pixi install
152
+ pixi run pytest # Run tests
153
+ pixi run lb-ap # Run the CLI
154
+
155
+ # Linting (any platform):
156
+ ruff check src/ tests/ # Lint
157
+ ruff check --fix src/ # Auto-fix
158
+ ruff format src/ tests/ # Format
159
+ ```
160
+
161
+ ## Legacy CLI
162
+
163
+ The original Click-based CLI is still available as `lb-ap-legacy` for backward compatibility but is deprecated.
@@ -0,0 +1,126 @@
1
+ # LbAPLocal
2
+
3
+ LbAPLocal is the Python library and CLI for running offline tests for the LHCb AnalysisProductions framework.
4
+
5
+ ## Installation
6
+
7
+ LbAPLocal is installed by default with the LHCb environment on lxplus. For users on external clusters, source the LHCb environment from CVMFS:
8
+
9
+ ```bash
10
+ source /cvmfs/lhcb.cern.ch/lib/LbEnv
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```
16
+ Usage: lb-ap [OPTIONS] COMMAND [ARGS]...
17
+
18
+ CLI for LHCb AnalysisProductions
19
+
20
+ Options:
21
+ -C, --change-dir PATH Change to this directory before running
22
+ -b, --branch TEXT Branch or tag to use
23
+ -v, --verbose Enable verbose output
24
+ --version Show version and exit
25
+ --help Show this message and exit
26
+
27
+ Commands:
28
+ versions List available tags of the Analysis Productions repository
29
+ clone Clone the AnalysisProductions repository
30
+ checkout Check out a branch or tag
31
+ list List available productions and jobs
32
+ test Test a job using CWL workflow
33
+ parse-log Analyse a Gaudi log file and show a summary with advice
34
+ make-reproducer Create a minimal reproducer from a failed grid job
35
+ cwl CWL-based workflow commands (generate, run, validate, test)
36
+ ```
37
+
38
+ ### Testing a job
39
+
40
+ The primary command. Generates a CWL workflow from the production configuration and executes it locally:
41
+
42
+ ```bash
43
+ lb-ap test MyAnalysis My2016MagDownJob
44
+ ```
45
+
46
+ Key options:
47
+
48
+ ```bash
49
+ lb-ap test MyAnalysis MyJob -i /path/to/input.dst # Use a specific input file
50
+ lb-ap test MyAnalysis MyJob -n 100 # Slice input to 100 events
51
+ lb-ap test MyAnalysis MyJob --n-lfns 5 # Test with 5 input LFNs
52
+ lb-ap test MyAnalysis MyJob --pick-smallest-lfn # Use smallest LFN for speed
53
+ lb-ap test MyAnalysis MyJob --download # Download input files locally
54
+ lb-ap test MyAnalysis MyJob --pretty # Real-time TUI monitoring
55
+ lb-ap test MyAnalysis MyJob --dry-run # Validate without executing
56
+ lb-ap test MyAnalysis MyJob -o ./output # Custom output directory
57
+ ```
58
+
59
+ If arguments are omitted, an interactive wizard guides you through the setup.
60
+
61
+ The `-n <N>` flag slices the input file to N events using `GaudiConf.mergeDST:dst` (remote read, local write). After slicing, a reuse hint is printed so subsequent runs can skip the slicing step by passing the sliced file with `-i`.
62
+
63
+ ### Custom input files
64
+
65
+ When testing a job that depends on another job, pass the upstream output with `-i`:
66
+
67
+ ```bash
68
+ lb-ap test MyAnalysis MyDownstreamJob -i /path/to/upstream_output.dst
69
+ ```
70
+
71
+ The input can be a local file path or an LFN (`LFN:/lhcb/...`).
72
+
73
+ ### Analysing log files
74
+
75
+ Parse a Gaudi log file for FATAL, ERROR, and WARNING messages with contextual advice:
76
+
77
+ ```bash
78
+ lb-ap parse-log DaVinci_00012345_00006789_1.log
79
+ ```
80
+
81
+ Log analysis is also integrated into `lb-ap test` — after a test completes (success or failure), any Gaudi log files in the output are automatically analysed and a summary is displayed.
82
+
83
+ ### Listing productions and jobs
84
+
85
+ ```bash
86
+ lb-ap list # List available productions
87
+ lb-ap list MyAnalysis # List jobs in a production
88
+ lb-ap list --tree # Tree view of all productions and jobs
89
+ ```
90
+
91
+ ### Repository management
92
+
93
+ ```bash
94
+ lb-ap clone --protocol ssh # Clone AnalysisProductions
95
+ lb-ap checkout v1r4315 # Check out a version
96
+ lb-ap versions MyAnalysis # List available versions
97
+ ```
98
+
99
+ ### Creating a minimal reproducer
100
+
101
+ From a failed grid job, create a self-contained reproducer package:
102
+
103
+ ```bash
104
+ lb-ap make-reproducer 12345678 # From DIRAC job ID
105
+ lb-ap make-reproducer --job-dir ./downloaded_job_dir # From local job directory
106
+ ```
107
+
108
+ ## Development
109
+
110
+ **Platform:** pixi targets `linux-64` only (requires CERN CVMFS and DIRAC).
111
+
112
+ ```bash
113
+ # On linux-64 (lxplus or CI):
114
+ pixi install
115
+ pixi run pytest # Run tests
116
+ pixi run lb-ap # Run the CLI
117
+
118
+ # Linting (any platform):
119
+ ruff check src/ tests/ # Lint
120
+ ruff check --fix src/ # Auto-fix
121
+ ruff format src/ tests/ # Format
122
+ ```
123
+
124
+ ## Legacy CLI
125
+
126
+ The original Click-based CLI is still available as `lb-ap-legacy` for backward compatibility but is deprecated.
@@ -26,7 +26,6 @@ dependencies = [
26
26
  "LbEnv",
27
27
  "apd>=0.6.0",
28
28
  "click",
29
- "consolemd",
30
29
  "mplhep",
31
30
  "requests",
32
31
  "setuptools",
@@ -119,11 +118,14 @@ pytest-cov = "*"
119
118
  pytest-mock = "*"
120
119
  pytest-recording = "*"
121
120
  pytest-timeout = "*"
121
+ pre-commit = "*"
122
122
  quickjs = "*"
123
123
 
124
124
  [tool.pixi.feature.testing.tasks]
125
125
  pytest = "pytest"
126
126
  test = "pytest"
127
+ lint = "pre-commit run --all-files"
128
+ pre-commit-install = "pre-commit install"
127
129
 
128
130
  [tool.pixi.tasks]
129
131
  lb-ap = "lb-ap"