LbAPLocal 0.10.2__tar.gz → 0.12.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 (164) hide show
  1. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/PKG-INFO +4 -3
  2. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/pyproject.toml +6 -2
  3. lbaplocal-0.12.0/src/LbAPLocal/cli/cvmfs.py +37 -0
  4. lbaplocal-0.12.0/src/LbAPLocal/cli/decfile_lexer.py +131 -0
  5. lbaplocal-0.12.0/src/LbAPLocal/cli/generate.py +531 -0
  6. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cli/main.py +400 -88
  7. lbaplocal-0.12.0/src/LbAPLocal/cli/mc_lookup.py +338 -0
  8. lbaplocal-0.12.0/src/LbAPLocal/cli/mc_wizard.py +487 -0
  9. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cli/wizards.py +150 -66
  10. lbaplocal-0.12.0/src/LbAPLocal/cwl/app_runner.py +507 -0
  11. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cwl/generate_replica_map.py +142 -95
  12. lbaplocal-0.12.0/src/LbAPLocal/cwl/quickjs_engine.py +111 -0
  13. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cwl/rewrite.py +57 -25
  14. lbaplocal-0.12.0/src/LbAPLocal/cwl/runner.py +139 -0
  15. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/handlers/mc_request.py +9 -4
  16. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/job_slice.py +8 -4
  17. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal.egg-info/PKG-INFO +4 -3
  18. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal.egg-info/SOURCES.txt +16 -0
  19. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal.egg-info/entry_points.txt +2 -0
  20. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal.egg-info/requires.txt +3 -2
  21. lbaplocal-0.12.0/src/LbAPLocal.egg-info/scm_file_list.json +156 -0
  22. lbaplocal-0.12.0/src/LbAPLocal.egg-info/scm_version.json +8 -0
  23. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/conftest.py +78 -73
  24. lbaplocal-0.12.0/tests/test_app_runner.py +101 -0
  25. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test_cwl_cli.py +132 -26
  26. lbaplocal-0.12.0/tests/test_cwl_runner.py +240 -0
  27. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test_execute.py +72 -1
  28. lbaplocal-0.12.0/tests/test_generate.py +467 -0
  29. lbaplocal-0.12.0/tests/test_get_mc.py +78 -0
  30. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test_handlers.py +31 -2
  31. lbaplocal-0.12.0/tests/test_input_resolution.py +205 -0
  32. lbaplocal-0.12.0/tests/test_mc_lookup.py +142 -0
  33. lbaplocal-0.12.0/tests/test_no_dirac_cwl.py +45 -0
  34. lbaplocal-0.12.0/tests/test_quickjs_engine.py +117 -0
  35. lbaplocal-0.10.2/src/LbAPLocal/cli/generate.py +0 -328
  36. lbaplocal-0.10.2/tests/test_generate.py +0 -129
  37. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/.coveragerc +0 -0
  38. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/.gitattributes +0 -0
  39. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/.gitignore +0 -0
  40. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/.gitlab-ci.yml +0 -0
  41. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/.pre-commit-config.yaml +0 -0
  42. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/CONTRIBUTING.md +0 -0
  43. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/LICENSE +0 -0
  44. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/README.md +0 -0
  45. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/example.json +0 -0
  46. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/setup.cfg +0 -0
  47. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/__init__.py +0 -0
  48. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cli/__init__.py +0 -0
  49. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cli/legacy.py +0 -0
  50. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cli/textual_ui.py +0 -0
  51. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/cwl/__init__.py +0 -0
  52. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/handlers/__init__.py +0 -0
  53. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/handlers/anaprod.py +0 -0
  54. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/log_parsing.py +0 -0
  55. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/models.py +0 -0
  56. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/testing.py +0 -0
  57. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal/utils.py +0 -0
  58. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal.egg-info/dependency_links.txt +0 -0
  59. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/src/LbAPLocal.egg-info/top_level.txt +0 -0
  60. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/capture_fixtures.py +0 -0
  61. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/cassettes/test_execute/test_run_test[2016_MagDown_PromptMC_D02KK-2444].yaml +0 -0
  62. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/cassettes/test_execute/test_run_test[2016_MagDown_PromptMC_D02KK_noautoconf-2444].yaml +0 -0
  63. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/cassettes/test_execute/test_run_test[2016_MagUp_PromptMC_D02KK-2393].yaml +0 -0
  64. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/cassettes/test_execute/test_run_test[2016_MagUp_PromptMC_D02KK_noautoconf-2393].yaml +0 -0
  65. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/.gitignore +0 -0
  66. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/.gitlab-ci.yml +0 -0
  67. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/AnalysisProductions.xenv +0 -0
  68. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bc2Bspi2JpsiPhi.py +0 -0
  69. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bd2JpsiKstar.py +0 -0
  70. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bd2JpsiKstar_stripping.py +0 -0
  71. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2DsPi.py +0 -0
  72. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi.py +0 -0
  73. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi_Prompt.py +0 -0
  74. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi_Prompt_PVMixer.py +0 -0
  75. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bs2JpsiPhi_Swave.py +0 -0
  76. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bu2JpsiKplus.py +0 -0
  77. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/Bu2JpsiKplus_stripping.py +0 -0
  78. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/LbJpsipK.py +0 -0
  79. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/README.md +0 -0
  80. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/helpers/__init__.py +0 -0
  81. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/helpers/stripping.py +0 -0
  82. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/helpers/tuple_maker.py +0 -0
  83. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/info.yaml +0 -0
  84. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/BsToJpsiPhi/sequence_setup.py +0 -0
  85. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/COPYING +0 -0
  86. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/RDs/README.md +0 -0
  87. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/RDs/Run1_Signal.py +0 -0
  88. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/RDs/Run2_Signal.py +0 -0
  89. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/RDs/helpers/__init__.py +0 -0
  90. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/RDs/helpers/signal_tuple_maker.py +0 -0
  91. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/RDs/info.yaml +0 -0
  92. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/README.md +0 -0
  93. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/__init__.py +0 -0
  94. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/2011_datatype.py +0 -0
  95. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/2012_datatype.py +0 -0
  96. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/2015_datatype.py +0 -0
  97. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/2016_datatype.py +0 -0
  98. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/2017_datatype.py +0 -0
  99. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/2018_datatype.py +0 -0
  100. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/B0ToK0ee.py +0 -0
  101. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/B0ToK0mumu.py +0 -0
  102. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/BpToKee.py +0 -0
  103. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/BpToKmumu.py +0 -0
  104. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/LbToL0ee.py +0 -0
  105. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/LbToL0eeSS.py +0 -0
  106. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/LbToL0emu.py +0 -0
  107. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/LbToL0emuSS.py +0 -0
  108. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/LbToL0mumu.py +0 -0
  109. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/LbToL0mumuSS.py +0 -0
  110. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/README.md +0 -0
  111. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/__init__.py +0 -0
  112. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/general_options.py +0 -0
  113. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/MC_tuple_maker.py +0 -0
  114. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/__init__.py +0 -0
  115. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/decay_descriptors.py +0 -0
  116. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/locations.py +0 -0
  117. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/related_info.py +0 -0
  118. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/stripping.py +0 -0
  119. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/tags.py +0 -0
  120. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/helpers/tuple_maker.py +0 -0
  121. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/info.yaml +0 -0
  122. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_general_options_DST.py +0 -0
  123. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_general_options_FDST.py +0 -0
  124. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_general_options_FMDST.py +0 -0
  125. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_general_options_MDST.py +0 -0
  126. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2JpsiKs_ee.py +0 -0
  127. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2JpsiKs_mm.py +0 -0
  128. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2Ksee.py +0 -0
  129. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2Ksmm.py +0 -0
  130. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2PsiKs_ee.py +0 -0
  131. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bd2PsiKs_mm.py +0 -0
  132. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bu2JpsiK_ee.py +0 -0
  133. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Bu2JpsiK_mm.py +0 -0
  134. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2JpsiL_ee.py +0 -0
  135. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2JpsiL_mm.py +0 -0
  136. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2Lee.py +0 -0
  137. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2Lem.py +0 -0
  138. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2Lmm.py +0 -0
  139. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2PsiL_ee.py +0 -0
  140. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/mc_samples/MC_Lb2PsiL_mm.py +0 -0
  141. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/sequence_setup.py +0 -0
  142. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/cbtesting/stripping_seq.py +0 -0
  143. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/executabletests/2016_MagDown_PromptMC_D02KK_autoconf.py +0 -0
  144. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/executabletests/2016_MagUp_PromptMC_D02KK_autoconf.py +0 -0
  145. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/executabletests/info.yaml +0 -0
  146. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/data-pkg-repo/executabletests/ntuple_options.py +0 -0
  147. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/error-failed-to-read-file.log +0 -0
  148. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/error-illegal-instruction.log +0 -0
  149. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/error-missing-shared-library.log +0 -0
  150. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/error-platform-unsupported.log +0 -0
  151. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/error-related-info-missing.log +0 -0
  152. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/good-DaVinci_00110296_00000038_1.log +0 -0
  153. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/good-DaVinci_00110296_00000194_1.log +0 -0
  154. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/data/example-logs/good-Gauss_00104988_00000011_1.log +0 -0
  155. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/fixture_loader.py +0 -0
  156. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/fixtures/executabletests/2016_MagDown_PromptMC_D02KK/query_result.json +0 -0
  157. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/fixtures/executabletests/2016_MagUp_PromptMC_D02KK/query_result.json +0 -0
  158. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/fixtures/executabletests/manifest.yaml +0 -0
  159. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/reslice_fixture.py +0 -0
  160. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test-input-dst/00070767_00000711_7.AllStreams_slice.dst +0 -0
  161. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test-input-dst/00070793_00000685_7.AllStreams_slice.dst +0 -0
  162. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test_cli.py +0 -0
  163. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test_local_datapkg.py +0 -0
  164. {lbaplocal-0.10.2 → lbaplocal-0.12.0}/tests/test_log_parse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: LbAPLocal
3
- Version: 0.10.2
3
+ Version: 0.12.0
4
4
  Summary: Tool to locally run tests for AnalysisProductions
5
5
  Author: LHCb
6
6
  Project-URL: Homepage, https://gitlab.cern.ch/lhcb-dpa/analysis-productions/lbaplocal
@@ -13,9 +13,10 @@ Classifier: Programming Language :: Python :: 3
13
13
  Requires-Python: >=3.12
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: LbAPCommon>=0.15.10
16
+ Requires-Dist: LbAPCommon>=0.19.0
17
17
  Requires-Dist: LbProdRun>1.12.2
18
- Requires-Dist: dirac-cwl>=1.1.3
18
+ Requires-Dist: cwltool>=3.1.20260108
19
+ Requires-Dist: cwl-utils>=0.41
19
20
  Requires-Dist: LbDiracWrappers
20
21
  Requires-Dist: LbEnv
21
22
  Requires-Dist: apd>=0.6.0
@@ -19,9 +19,11 @@ classifiers = [
19
19
  ]
20
20
  requires-python = ">=3.12"
21
21
  dependencies = [
22
- "LbAPCommon>=0.15.10",
22
+ "LbAPCommon>=0.19.0",
23
23
  "LbProdRun>1.12.2",
24
- "dirac-cwl>=1.1.3",
24
+ # floor = oldest verified build that routes JS eval through cwl-utils (set_js_engine)
25
+ "cwltool>=3.1.20260108",
26
+ "cwl-utils>=0.41",
25
27
  "LbDiracWrappers",
26
28
  "LbEnv",
27
29
  "apd>=0.6.0",
@@ -57,6 +59,8 @@ testing = [
57
59
  [project.scripts]
58
60
  lb-ap = "LbAPLocal.cli.main:app"
59
61
  lb-ap-legacy = "LbAPLocal.cli.legacy:main"
62
+ lb-ap-run-app = "LbAPLocal.cwl.app_runner:main"
63
+ lb-ap-cwl-run = "LbAPLocal.cwl.runner:app"
60
64
 
61
65
  [tool.black]
62
66
  exclude = '''
@@ -0,0 +1,37 @@
1
+ ###############################################################################
2
+ # (c) Copyright 2026 CERN for the benefit of the LHCb Collaboration #
3
+ # #
4
+ # This software is distributed under the terms of the GNU General Public #
5
+ # Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". #
6
+ # #
7
+ # In applying this licence, CERN does not waive the privileges and immunities #
8
+ # granted to it by virtue of its status as an Intergovernmental Organization #
9
+ # or submit itself to any jurisdiction. #
10
+ ###############################################################################
11
+ """Helpers for locating versioned LHCb packages on CVMFS."""
12
+
13
+ import re
14
+ from fnmatch import fnmatch
15
+ from pathlib import Path
16
+
17
+ # Matches LHCb version directories like ``v32r48`` or ``v26r4p1``.
18
+ VERSION_PATTERN = re.compile(r"v(\d+)r(\d+)(?:p(\d+))?")
19
+
20
+
21
+ def latest_available(path: Path, pattern: str = "v*") -> str:
22
+ """Return the highest-numbered version directory under ``path``.
23
+
24
+ Only directories whose names match ``VERSION_PATTERN`` and the glob
25
+ ``pattern`` are considered.
26
+ """
27
+ matches = {}
28
+ for version_path in path.iterdir():
29
+ if not version_path.is_dir():
30
+ continue
31
+ version = version_path.name
32
+ if match := VERSION_PATTERN.fullmatch(version):
33
+ if not fnmatch(version, pattern):
34
+ continue
35
+ version_segments = tuple(0 if x is None else int(x) for x in match.groups())
36
+ matches[version_segments] = version
37
+ return max(matches.items())[1]
@@ -0,0 +1,131 @@
1
+ ###############################################################################
2
+ # (c) Copyright 2026 CERN for the benefit of the LHCb Collaboration #
3
+ # #
4
+ # This software is distributed under the terms of the GNU General Public #
5
+ # Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". #
6
+ # #
7
+ # In applying this licence, CERN does not waive the privileges and immunities #
8
+ # granted to it by virtue of its status as an Intergovernmental Organization #
9
+ # or submit itself to any jurisdiction. #
10
+ ###############################################################################
11
+ """A small Pygments lexer for EvtGen ``.dec`` decay files.
12
+
13
+ Used to syntax-highlight the decay-file preview in the ``lb-ap generate`` wizard.
14
+ It highlights:
15
+
16
+ * the structured ``# Key: value`` header (NickName, Descriptor, ...),
17
+ * EvtGen keywords (``Alias``, ``Decay``, ``Enddecay``, ``CDecay``, ...),
18
+ * decay models and numeric branching fractions, and
19
+ * embedded Python inside ``# InsertPythonCode: ... # EndInsertPythonCode``
20
+ blocks (the code lines are ``#``-commented in the file; we strip the leading
21
+ ``#`` and lex the remainder as real Python).
22
+ """
23
+
24
+ import re
25
+
26
+ from pygments.lexer import Lexer, RegexLexer, bygroups
27
+ from pygments.lexers.python import PythonLexer
28
+ from pygments.token import (
29
+ Comment,
30
+ Keyword,
31
+ Name,
32
+ Number,
33
+ Operator,
34
+ Text,
35
+ )
36
+
37
+ # Keywords that introduce statements in a decay file.
38
+ _KEYWORDS = (
39
+ "Alias",
40
+ "ChargeConj",
41
+ "Decay",
42
+ "Enddecay",
43
+ "CDecay",
44
+ "Define",
45
+ "Particle",
46
+ "ModelAlias",
47
+ "JetSetPar",
48
+ "SetLineshapePW",
49
+ "ChangeMassMin",
50
+ "ChangeMassMax",
51
+ "End",
52
+ )
53
+
54
+ _PYCODE_START = re.compile(r"^#+\s*InsertPythonCode\b")
55
+ _PYCODE_END = re.compile(r"^#+\s*EndInsertPythonCode\b")
56
+ # A python-code line in the block: leading whitespace + "#" + optional space,
57
+ # then the actual code.
58
+ _PY_PREFIX = re.compile(r"(\s*#\s?)(.*)$")
59
+
60
+
61
+ class _DecBaseLexer(RegexLexer):
62
+ """The non-Python token rules for ``.dec`` files."""
63
+
64
+ name = "DecFileBase"
65
+
66
+ tokens = {
67
+ "root": [
68
+ # Header metadata lines: "# NickName: value"
69
+ (
70
+ r"^(#\s*)([A-Za-z][\w ]*?)(:)(.*)$",
71
+ bygroups(Comment, Name.Attribute, Operator, Comment),
72
+ ),
73
+ # Plain comments
74
+ (r"#.*$", Comment),
75
+ # Statement keywords
76
+ (r"\b(?:%s)\b" % "|".join(_KEYWORDS), Keyword),
77
+ # Branching fractions / numbers
78
+ (r"[-+]?\d+\.\d+(?:[eE][-+]?\d+)?", Number.Float),
79
+ (r"[-+]?\d+", Number.Integer),
80
+ # Decay arrows / operators
81
+ (r"->|,", Operator),
82
+ # Particle names (incl. the usual EvtGen punctuation)
83
+ (r"[A-Za-z][\w*+\-/'~()]*", Name),
84
+ (r"\s+", Text),
85
+ (r".", Text),
86
+ ],
87
+ }
88
+
89
+
90
+ class DecFileLexer(Lexer):
91
+ """Highlight ``.dec`` files, delegating embedded Python to ``PythonLexer``."""
92
+
93
+ name = "DecFile"
94
+ aliases = ["dec", "decfile"]
95
+ filenames = ["*.dec"]
96
+
97
+ def __init__(self, **options):
98
+ super().__init__(**options)
99
+ self._base = _DecBaseLexer(**options)
100
+ self._python = PythonLexer(**options)
101
+
102
+ def get_tokens_unprocessed(self, text):
103
+ pos = 0
104
+ in_python = False
105
+ for line in text.splitlines(keepends=True):
106
+ newline = "\n" if line.endswith("\n") else ""
107
+ body = line[: -len(newline)] if newline else line
108
+ stripped = body.strip()
109
+
110
+ if not in_python and _PYCODE_START.match(stripped):
111
+ yield from self._emit(self._base, line, pos)
112
+ in_python = True
113
+ elif in_python and _PYCODE_END.match(stripped):
114
+ yield from self._emit(self._base, line, pos)
115
+ in_python = False
116
+ elif in_python and (match := _PY_PREFIX.match(body)):
117
+ prefix, code = match.group(1), match.group(2)
118
+ # The "# " comment prefix, then the code lexed as real Python.
119
+ yield pos, Comment, prefix
120
+ yield from self._emit(self._python, code, pos + len(prefix))
121
+ if newline:
122
+ yield pos + len(prefix) + len(code), Text, newline
123
+ else:
124
+ yield from self._emit(self._base, line, pos)
125
+
126
+ pos += len(line)
127
+
128
+ @staticmethod
129
+ def _emit(lexer, chunk, offset):
130
+ for index, token, value in lexer.get_tokens_unprocessed(chunk):
131
+ yield offset + index, token, value