jolt 0.9.449__tar.gz → 0.9.456__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 (213) hide show
  1. {jolt-0.9.449 → jolt-0.9.456}/PKG-INFO +1 -1
  2. {jolt-0.9.449 → jolt-0.9.456}/jolt/config.py +13 -0
  3. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/abseil.py +2 -0
  4. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/blake3.py +7 -1
  5. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/brotli.py +2 -0
  6. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/cares.py +2 -0
  7. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/curl.py +6 -4
  8. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/grpc.py +8 -6
  9. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/protobuf.py +3 -1
  10. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/re2.py +2 -0
  11. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/ssl.py +1 -0
  12. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/zlib.py +7 -1
  13. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/zstd.py +2 -0
  14. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/cache.py +1 -1
  15. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/scheduler.py +16 -3
  16. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/selfdeploy.py +1 -1
  17. {jolt-0.9.449 → jolt-0.9.456}/jolt/utils.py +38 -0
  18. jolt-0.9.456/jolt/version.py +1 -0
  19. {jolt-0.9.449 → jolt-0.9.456}/jolt.egg-info/PKG-INFO +1 -1
  20. jolt-0.9.449/jolt/version.py +0 -1
  21. {jolt-0.9.449 → jolt-0.9.456}/README.rst +0 -0
  22. {jolt-0.9.449 → jolt-0.9.456}/jolt/__init__.py +0 -0
  23. {jolt-0.9.449 → jolt-0.9.456}/jolt/__main__.py +0 -0
  24. {jolt-0.9.449 → jolt-0.9.456}/jolt/bin/fstree-darwin-x86_64 +0 -0
  25. {jolt-0.9.449 → jolt-0.9.456}/jolt/bin/fstree-linux-x86_64 +0 -0
  26. {jolt-0.9.449 → jolt-0.9.456}/jolt/cache.py +0 -0
  27. {jolt-0.9.449 → jolt-0.9.456}/jolt/chroot.py +0 -0
  28. {jolt-0.9.449 → jolt-0.9.456}/jolt/cli.py +0 -0
  29. {jolt-0.9.449 → jolt-0.9.456}/jolt/colors.py +0 -0
  30. {jolt-0.9.449 → jolt-0.9.456}/jolt/common_pb2.py +0 -0
  31. {jolt-0.9.449 → jolt-0.9.456}/jolt/common_pb2_grpc.py +0 -0
  32. {jolt-0.9.449 → jolt-0.9.456}/jolt/error.py +0 -0
  33. {jolt-0.9.449 → jolt-0.9.456}/jolt/expires.py +0 -0
  34. {jolt-0.9.449 → jolt-0.9.456}/jolt/filesystem.py +0 -0
  35. {jolt-0.9.449 → jolt-0.9.456}/jolt/graph.py +0 -0
  36. {jolt-0.9.449 → jolt-0.9.456}/jolt/hooks.py +0 -0
  37. {jolt-0.9.449 → jolt-0.9.456}/jolt/influence.py +0 -0
  38. {jolt-0.9.449 → jolt-0.9.456}/jolt/inspection.py +0 -0
  39. {jolt-0.9.449 → jolt-0.9.456}/jolt/loader.py +0 -0
  40. {jolt-0.9.449 → jolt-0.9.456}/jolt/log.py +0 -0
  41. {jolt-0.9.449 → jolt-0.9.456}/jolt/manifest.py +0 -0
  42. {jolt-0.9.449 → jolt-0.9.456}/jolt/options.py +0 -0
  43. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/__init__.py +0 -0
  44. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/asio.py +0 -0
  45. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/autoconf.py +0 -0
  46. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/automake.py +0 -0
  47. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/b2.py +0 -0
  48. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/boost.py +0 -0
  49. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/boringssl.py +0 -0
  50. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/busybox.py +0 -0
  51. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/bzip2.py +0 -0
  52. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/catch2.py +0 -0
  53. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/cbindgen.py +0 -0
  54. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/cista.py +0 -0
  55. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/clang.py +0 -0
  56. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/cli11.py +0 -0
  57. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/cmake.py +0 -0
  58. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/cpython.py +0 -0
  59. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/crun.py +0 -0
  60. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/dbus.py +0 -0
  61. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/double_conversion.py +0 -0
  62. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/fastfloat.py +0 -0
  63. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/ffmpeg.py +0 -0
  64. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/flatbuffers.py +0 -0
  65. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/fmt.py +0 -0
  66. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/fstree.py +0 -0
  67. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/gflags.py +0 -0
  68. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/glib.py +0 -0
  69. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/glog.py +0 -0
  70. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/glslang.py +0 -0
  71. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/golang.py +0 -0
  72. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/googlebenchmark.py +0 -0
  73. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/googletest.py +0 -0
  74. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/gperf.py +0 -0
  75. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/hdf5.py +0 -0
  76. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/help2man.py +0 -0
  77. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/inja.py +0 -0
  78. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/jsoncpp.py +0 -0
  79. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libarchive.py +0 -0
  80. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libcap.py +0 -0
  81. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libdrm.py +0 -0
  82. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libedit.py +0 -0
  83. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libevent.py +0 -0
  84. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libexpat.py +0 -0
  85. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libfastjson.py +0 -0
  86. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libffi.py +0 -0
  87. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libglvnd.py +0 -0
  88. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libogg.py +0 -0
  89. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libpciaccess.py +0 -0
  90. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libseccomp.py +0 -0
  91. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libtirpc.py +0 -0
  92. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libtool.py +0 -0
  93. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libunwind.py +0 -0
  94. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libva.py +0 -0
  95. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libvorbis.py +0 -0
  96. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libxml2.py +0 -0
  97. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libxslt.py +0 -0
  98. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/libyajl.py +0 -0
  99. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/llvm.py +0 -0
  100. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/lua.py +0 -0
  101. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/lz4.py +0 -0
  102. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/m4.py +0 -0
  103. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/make.py +0 -0
  104. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/mesa.py +0 -0
  105. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/meson.py +0 -0
  106. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/mstch.py +0 -0
  107. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/mysql.py +0 -0
  108. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/nasm.py +0 -0
  109. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/ncurses.py +0 -0
  110. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/ng_log.py +0 -0
  111. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/ninja.py +0 -0
  112. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/nlohmann_json.py +0 -0
  113. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/nodejs.py +0 -0
  114. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/opencv.py +0 -0
  115. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/openjdk.py +0 -0
  116. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/openssl.py +0 -0
  117. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/paho.py +0 -0
  118. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/patchelf.py +0 -0
  119. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/perl.py +0 -0
  120. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/pkgconfig.py +0 -0
  121. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/poco.py +0 -0
  122. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/pugixml.py +0 -0
  123. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/python.py +0 -0
  124. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/qt.py +0 -0
  125. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/rapidjson.py +0 -0
  126. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/rapidyaml.py +0 -0
  127. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/re2c.py +0 -0
  128. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/readline.py +0 -0
  129. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/rust.py +0 -0
  130. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/sdl.py +0 -0
  131. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/simdjson.py +0 -0
  132. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/soci.py +0 -0
  133. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/spdlog.py +0 -0
  134. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/spirv_llvm.py +0 -0
  135. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/spirv_tools.py +0 -0
  136. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/sqlite.py +0 -0
  137. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/texinfo.py +0 -0
  138. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/tomlplusplus.py +0 -0
  139. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/wayland.py +0 -0
  140. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/x11.py +0 -0
  141. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/xerces_c.py +0 -0
  142. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/xorg.py +0 -0
  143. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/xz.py +0 -0
  144. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/yamlcpp.py +0 -0
  145. {jolt-0.9.449 → jolt-0.9.456}/jolt/pkgs/zeromq.py +0 -0
  146. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/__init__.py +0 -0
  147. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/alias.py +0 -0
  148. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/allure.py +0 -0
  149. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/autotools.py +0 -0
  150. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/autoweight.py +0 -0
  151. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/cmake.py +0 -0
  152. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/conan.py +0 -0
  153. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/cxx.py +0 -0
  154. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/cxxinfo.py +0 -0
  155. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/dashboard.py +0 -0
  156. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/docker.py +0 -0
  157. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/email.py +0 -0
  158. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/email.xslt +0 -0
  159. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/environ.py +0 -0
  160. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/fetch.py +0 -0
  161. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/gdb.py +0 -0
  162. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/gerrit.py +0 -0
  163. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/git.py +0 -0
  164. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/golang.py +0 -0
  165. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/googletest.py +0 -0
  166. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/http.py +0 -0
  167. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/junit.py +0 -0
  168. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/libtool.py +0 -0
  169. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/linux.py +0 -0
  170. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/logstash.py +0 -0
  171. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/meson.py +0 -0
  172. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/ninja-compdb.py +0 -0
  173. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/ninja.py +0 -0
  174. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/nodejs.py +0 -0
  175. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/paths.py +0 -0
  176. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/pkgconfig.py +0 -0
  177. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/podman.py +0 -0
  178. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/python.py +0 -0
  179. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/__init__.py +0 -0
  180. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/administration_pb2.py +0 -0
  181. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/administration_pb2_grpc.py +0 -0
  182. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/log_pb2.py +0 -0
  183. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/log_pb2_grpc.py +0 -0
  184. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/scheduler_pb2.py +0 -0
  185. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/scheduler_pb2_grpc.py +0 -0
  186. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/worker_pb2.py +0 -0
  187. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/remote_execution/worker_pb2_grpc.py +0 -0
  188. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/report.py +0 -0
  189. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/rust.py +0 -0
  190. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/strings.py +0 -0
  191. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/symlinks.py +0 -0
  192. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/telemetry.py +0 -0
  193. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/timeline.py +0 -0
  194. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/volume.py +0 -0
  195. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/yaml-ninja.py +0 -0
  196. {jolt-0.9.449 → jolt-0.9.456}/jolt/plugins/yamltask.py +0 -0
  197. {jolt-0.9.449 → jolt-0.9.456}/jolt/scheduler.py +0 -0
  198. {jolt-0.9.449 → jolt-0.9.456}/jolt/tasks.py +0 -0
  199. {jolt-0.9.449 → jolt-0.9.456}/jolt/templates/cxxexecutable.cmake.template +0 -0
  200. {jolt-0.9.449 → jolt-0.9.456}/jolt/templates/cxxlibrary.cmake.template +0 -0
  201. {jolt-0.9.449 → jolt-0.9.456}/jolt/templates/export.sh.template +0 -0
  202. {jolt-0.9.449 → jolt-0.9.456}/jolt/templates/timeline.html.template +0 -0
  203. {jolt-0.9.449 → jolt-0.9.456}/jolt/timer.py +0 -0
  204. {jolt-0.9.449 → jolt-0.9.456}/jolt/tools.py +0 -0
  205. {jolt-0.9.449 → jolt-0.9.456}/jolt/version_utils.py +0 -0
  206. {jolt-0.9.449 → jolt-0.9.456}/jolt/xmldom.py +0 -0
  207. {jolt-0.9.449 → jolt-0.9.456}/jolt.egg-info/SOURCES.txt +0 -0
  208. {jolt-0.9.449 → jolt-0.9.456}/jolt.egg-info/dependency_links.txt +0 -0
  209. {jolt-0.9.449 → jolt-0.9.456}/jolt.egg-info/entry_points.txt +0 -0
  210. {jolt-0.9.449 → jolt-0.9.456}/jolt.egg-info/requires.txt +0 -0
  211. {jolt-0.9.449 → jolt-0.9.456}/jolt.egg-info/top_level.txt +0 -0
  212. {jolt-0.9.449 → jolt-0.9.456}/setup.cfg +0 -0
  213. {jolt-0.9.449 → jolt-0.9.456}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jolt
3
- Version: 0.9.449
3
+ Version: 0.9.456
4
4
  Summary: A task executor
5
5
  Home-page: https://github.com/srand/jolt
6
6
  Author: Robert Andersson
@@ -1,4 +1,5 @@
1
1
  from configparser import ConfigParser, NoOptionError, NoSectionError
2
+ from datetime import timedelta
2
3
  from urllib.parse import urlparse
3
4
  import os
4
5
  import re
@@ -152,6 +153,18 @@ def get(section, key, default=None, expand=True, alias=None):
152
153
  return utils.expand(val) if expand and val is not None else val
153
154
 
154
155
 
156
+ def getduration(section, key, default=None, alias=None):
157
+ value = get(section, key, default=None, alias=alias)
158
+ if value is None:
159
+ if type(default) is timedelta:
160
+ return default
161
+ elif default is not None:
162
+ value = str(default)
163
+ else:
164
+ return None
165
+ return utils.parse_duration(value)
166
+
167
+
155
168
  def getint(section, key, default=None, alias=None):
156
169
  value = get(section, key, default=default, alias=alias)
157
170
  if value is not None:
@@ -13,6 +13,7 @@ class Abseil(cmake.CMake):
13
13
 
14
14
  name = "abseil"
15
15
  version = Parameter("20250814.1")
16
+ pic = BooleanParameter(False, help="Build with position independent code.")
16
17
  shared = BooleanParameter(False, help="Build shared libraries")
17
18
  requires_git = ["git:url=https://github.com/abseil/abseil-cpp.git,rev={version}"]
18
19
  srcdir = "{git[abseil-cpp]}"
@@ -20,6 +21,7 @@ class Abseil(cmake.CMake):
20
21
  "ABSL_MSVC_STATIC_RUNTIME=OFF",
21
22
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
22
23
  "CMAKE_CXX_STANDARD=17",
24
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
23
25
  ]
24
26
 
25
27
  def publish(self, artifact, tools):
@@ -1,4 +1,4 @@
1
- from jolt import attributes, Parameter
1
+ from jolt import attributes, BooleanParameter, Parameter
2
2
  from jolt.plugins import cmake, git
3
3
  from jolt.tasks import TaskRegistry
4
4
 
@@ -8,8 +8,14 @@ from jolt.tasks import TaskRegistry
8
8
  class Blake3(cmake.CMake):
9
9
  name = "blake3"
10
10
  version = Parameter("1.8.3", help="blake3 version.")
11
+ pic = BooleanParameter(False, help="Build with position independent code.")
12
+ shared = BooleanParameter(False, help="Build shared libraries.")
11
13
  requires_git = ["git:url=https://github.com/BLAKE3-team/BLAKE3.git,rev={version}"]
12
14
  srcdir = "{git[BLAKE3]}/c"
15
+ options = [
16
+ "BUILD_SHARED_LIBS={shared[ON,OFF]}",
17
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
18
+ ]
13
19
 
14
20
 
15
21
  TaskRegistry.get().add_task_class(Blake3)
@@ -9,11 +9,13 @@ from jolt.tasks import TaskRegistry
9
9
  class Brotli(cmake.CMake):
10
10
  name = "brotli"
11
11
  version = Parameter("1.2.0", help="Brotli version.")
12
+ pic = BooleanParameter(False, help="Build with position independent code.")
12
13
  shared = BooleanParameter(False, help="Build shared libraries.")
13
14
  requires_git = ["git:url=https://github.com/google/brotli.git,rev=v{version},submodules=true"]
14
15
  srcdir = "{git[brotli]}"
15
16
  options = [
16
17
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
18
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
17
19
  ]
18
20
 
19
21
 
@@ -11,6 +11,7 @@ from jolt.tasks import TaskRegistry
11
11
  class CAres(cmake.CMake):
12
12
  name = "c-ares"
13
13
  version = Parameter("1.34.6", help="c-ares version.")
14
+ pic = BooleanParameter(False, help="Build with position independent code.")
14
15
  shared = BooleanParameter(False, help="Build shared libraries.")
15
16
  requires_git = ["git:url=https://github.com/c-ares/c-ares.git,rev=v{version}"]
16
17
  srcdir = "{git[c-ares]}"
@@ -18,6 +19,7 @@ class CAres(cmake.CMake):
18
19
  "CARES_SHARED={shared[ON,OFF]}",
19
20
  "CARES_STATIC={shared[OFF,ON]}",
20
21
  "CARES_BUILD_TESTS=OFF",
22
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
21
23
  ]
22
24
 
23
25
 
@@ -16,18 +16,20 @@ from jolt.tasks import TaskRegistry
16
16
  class Curl(cmake.CMake):
17
17
  name = "curl"
18
18
  version = Parameter("8.17.0", help="Curl version.")
19
+ pic = BooleanParameter(False, help="Build with position independent code.")
19
20
  shared = BooleanParameter(False, help="Build shared libraries.")
20
- requires_brotli = ["brotli"]
21
+ requires_brotli = ["brotli:pic={pic},shared={shared}"]
21
22
  requires_git = ["git:url=https://github.com/curl/curl.git,rev=curl-{_version_tag},submodules=true"]
22
- requires_ssl = ["virtual/ssl:shared={shared}"]
23
- requires_zlib = ["virtual/zlib"]
24
- requires_zstd = ["zstd"]
23
+ requires_ssl = ["virtual/ssl:pic={pic},shared={shared}"]
24
+ requires_zlib = ["virtual/zlib:pic={pic},shared={shared}"]
25
+ requires_zstd = ["zstd:pic={pic},shared={shared}"]
25
26
  srcdir = "{git[curl]}"
26
27
  options = [
27
28
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
28
29
  "CURL_USE_LIBPSL=OFF",
29
30
  "USE_LIBIDN2=OFF",
30
31
  "OPENSSL_USE_STATIC_LIBS={shared[OFF,ON]}",
32
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
31
33
  ]
32
34
 
33
35
  @property
@@ -19,19 +19,21 @@ from jolt.tasks import TaskRegistry
19
19
  class Grpc(cmake.CMake):
20
20
  name = "grpc"
21
21
  version = Parameter("1.76.0", help="Grpc version.")
22
+ pic = BooleanParameter(False, help="Build with position independent code.")
22
23
  shared = BooleanParameter(False, help="Build shared libraries.")
23
24
  generator = "Ninja"
24
- requires_abseil = ["abseil:shared={shared}"]
25
- requires_cares = ["c-ares:shared={shared}"]
25
+ requires_abseil = ["abseil:pic={pic},shared={shared}"]
26
+ requires_cares = ["c-ares:pic={pic},shared={shared}"]
26
27
  requires_git = ["git:url=https://github.com/grpc/grpc.git,path={buildroot}/git_grpc,rev=v{version},submodules=true"]
27
28
  requires_nasm_windows = ["nasm"]
28
- requires_protobuf = ["protobuf:shared={shared}"]
29
- requires_re2 = ["re2:shared={shared}"]
30
- requires_ssl = ["virtual/ssl:shared={shared}"]
31
- requires_zlib = ["zlib"]
29
+ requires_protobuf = ["protobuf:pic={pic},shared={shared}"]
30
+ requires_re2 = ["re2:pic={pic},shared={shared}"]
31
+ requires_ssl = ["virtual/ssl:pic={pic},shared={shared}"]
32
+ requires_zlib = ["virtual/zlib:pic={pic},shared={shared}"]
32
33
  srcdir = "{git[grpc]}"
33
34
  options = [
34
35
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
36
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
35
37
  "CMAKE_CXX_STANDARD=17",
36
38
  "gRPC_ABSL_PROVIDER=package",
37
39
  "gRPC_BUILD_TESTS=OFF",
@@ -19,13 +19,15 @@ class Protobuf(cmake.CMake):
19
19
 
20
20
  name = "protobuf"
21
21
  version = Parameter("33.2", help="Protobuf version.")
22
+ pic = BooleanParameter(False, help="Build with position independent code.")
22
23
  shared = BooleanParameter(False, help="Build shared libraries")
23
- requires_abseil = ["abseil:shared={shared}"]
24
+ requires_abseil = ["abseil:pic={pic},shared={shared}"]
24
25
  requires_git = ["git:url=https://github.com/protocolbuffers/protobuf.git,rev=v{version}"]
25
26
  srcdir = "{git[protobuf]}"
26
27
  options = [
27
28
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
28
29
  "CMAKE_CXX_STANDARD=17",
30
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
29
31
  "protobuf_BUILD_TESTS=OFF",
30
32
  "protobuf_MSVC_STATIC_RUNTIME=OFF",
31
33
  ]
@@ -12,12 +12,14 @@ from jolt.tasks import TaskRegistry
12
12
  class RE2(cmake.CMake):
13
13
  name = "re2"
14
14
  version = Parameter("2025-11-05", help="re2 version.")
15
+ pic = BooleanParameter(False, help="Build with position independent code.")
15
16
  shared = BooleanParameter(False, help="Build shared libraries.")
16
17
  requires_abseil = ["abseil:shared={shared}"]
17
18
  requires_git = ["git:url=https://github.com/google/re2.git,rev={version}"]
18
19
  srcdir = "{git[re2]}"
19
20
  options = [
20
21
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
22
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
21
23
  "RE2_BUILD_TESTING=OFF",
22
24
  ]
23
25
 
@@ -5,6 +5,7 @@ from jolt.tasks import TaskRegistry
5
5
 
6
6
  class VirtualSsl(Alias):
7
7
  name = "virtual/ssl"
8
+ pic = BooleanParameter(False, "Build with position independent code.")
8
9
  shared = BooleanParameter(False, help="Use shared libraries.")
9
10
  requires = ["openssl:shared={shared}"]
10
11
 
@@ -12,11 +12,13 @@ from jolt.tasks import TaskRegistry
12
12
  class Zlib(cmake.CMake):
13
13
  name = "zlib"
14
14
  version = Parameter("1.3.1", help="Zlib version.")
15
+ pic = BooleanParameter(False, "Build with position independent code.")
15
16
  shared = BooleanParameter(False, "Enable shared libraries.")
16
17
  requires_git = ["git:clean=true,url=https://github.com/madler/zlib.git,rev=v{version}"]
17
18
  srcdir = "{git[zlib]}"
18
19
  options = [
19
20
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
21
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
20
22
  "ZLIB_BUILD_EXAMPLES=OFF",
21
23
  ]
22
24
 
@@ -58,12 +60,14 @@ class Zlib(cmake.CMake):
58
60
  class ZlibNg(cmake.CMake):
59
61
  name = "zlib-ng"
60
62
  version = Parameter("2.3.2", help="Zlib version.")
63
+ pic = BooleanParameter(False, "Build with position independent code.")
61
64
  shared = BooleanParameter(False, "Enable shared libraries.")
62
65
  requires_git = ["git:url=https://github.com/zlib-ng/zlib-ng.git,rev={version}"]
63
66
  srcdir = "{git[zlib-ng]}"
64
67
  options = [
65
68
  "BUILD_SHARED_LIBS={shared[ON,OFF]}",
66
69
  "BUILD_TESTING=OFF",
70
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
67
71
  ]
68
72
 
69
73
  def publish(self, artifact, tools):
@@ -77,7 +81,9 @@ class ZlibNg(cmake.CMake):
77
81
 
78
82
  class VirtualZlib(Alias):
79
83
  name = "virtual/zlib"
80
- requires = ["zlib"]
84
+ pic = BooleanParameter(False, "Build with position independent code.")
85
+ shared = BooleanParameter(False, "Enable shared libraries.")
86
+ requires = ["zlib:pic={pic},shared={shared}"]
81
87
 
82
88
 
83
89
  TaskRegistry.get().add_task_class(Zlib)
@@ -12,10 +12,12 @@ from jolt.tasks import TaskRegistry
12
12
  class Zstd(cmake.CMake):
13
13
  name = "zstd"
14
14
  version = Parameter("ebc93b0", help="zstd version.")
15
+ pic = BooleanParameter(False, "Build with position independent code.")
15
16
  shared = BooleanParameter(False, "Enable shared libraries.")
16
17
  requires_git = ["git:url=https://github.com/facebook/zstd.git,rev={version}"]
17
18
  srcdir = "{git[zstd]}"
18
19
  options = [
20
+ "CMAKE_POSITION_INDEPENDENT_CODE={pic[ON,OFF]}",
19
21
  "ZSTD_BUILD_SHARED={shared[ON,OFF]}",
20
22
  "ZSTD_BUILD_STATIC={shared[OFF,ON]}",
21
23
  "ZSTD_BUILD_TESTS=OFF",
@@ -20,7 +20,7 @@ class Cache(cache.StorageProvider):
20
20
  def __init__(self, cache):
21
21
  super().__init__()
22
22
  self._cache = cache
23
- self._uri = config.get(NAME, "uri", "http://cache")
23
+ self._uri = config.get(NAME, "http_uri", config.get(NAME, "uri", "http://cache"))
24
24
  self._uri = self._uri.rstrip("/")
25
25
  raise_error_if(not self._uri, "Cache Service URI not configured")
26
26
  self._file_uri = self._uri + "/files"
@@ -33,6 +33,18 @@ NAME = "scheduler"
33
33
  TYPE = "Remote execution"
34
34
 
35
35
 
36
+ grpc_keepalive_opts = []
37
+ grpc_keepalive_time = config.getduration(NAME, "grpc_keepalive_time")
38
+ grpc_keepalive_timeout = config.getduration(NAME, "grpc_keepalive_timeout")
39
+ grpc_keepalive_without_calls = config.getboolean(NAME, "grpc_keepalive_without_calls", False)
40
+ if grpc_keepalive_time is not None:
41
+ grpc_keepalive_opts.append(("grpc.keepalive_time_ms", int(grpc_keepalive_time.total_seconds() * 1000)))
42
+ if grpc_keepalive_timeout is not None:
43
+ grpc_keepalive_opts.append(("grpc.keepalive_timeout_ms", int(grpc_keepalive_timeout.total_seconds() * 1000)))
44
+ if grpc_keepalive_without_calls:
45
+ grpc_keepalive_opts.append(("grpc.keepalive_permit_without_calls", 1))
46
+
47
+
36
48
  def locked(func):
37
49
  """ Decorator to lock a method. """
38
50
  def _f(self, *args, **kwargs):
@@ -394,7 +406,7 @@ class RemoteSession(object):
394
406
  self.factory = factory
395
407
 
396
408
  # Address of the scheduler.
397
- self.address = config.geturi(NAME, "uri", "tcp://scheduler.:9090")
409
+ self.address = config.geturi(NAME, "grpc_uri", config.geturi(NAME, "uri", "tcp://scheduler.:9090"))
398
410
  raise_error_if(self.address.scheme not in ["tcp"], "Invalid scheme in scheduler URI config: {}", self.address.scheme)
399
411
  raise_error_if(not self.address.netloc, "Invalid network address in scheduler URI config: {}", self.address.netloc)
400
412
 
@@ -404,6 +416,7 @@ class RemoteSession(object):
404
416
  # GRPC channel.
405
417
  self.channel = grpc.insecure_channel(
406
418
  target=self.address.netloc,
419
+ options=grpc_keepalive_opts,
407
420
  )
408
421
 
409
422
  # GRPC stub for the scheduler service.
@@ -559,11 +572,11 @@ log.verbose("[Remote] Loaded")
559
572
  @click.argument("request", required=True)
560
573
  @click.pass_context
561
574
  def executor(ctx, worker, build, request):
562
- address = config.geturi(NAME, "uri", "tcp://scheduler.:9090")
575
+ address = config.geturi(NAME, "grpc_uri", "tcp://scheduler.:9090")
563
576
  raise_error_if(address.scheme not in ["tcp"], "Invalid scheme in scheduler URI config: {}", address.scheme)
564
577
  raise_error_if(not address.netloc, "Invalid network address in scheduler URI config: {}", address.netloc)
565
578
 
566
- channel = grpc.insecure_channel(address.netloc)
579
+ channel = grpc.insecure_channel(address.netloc, options=grpc_keepalive_opts)
567
580
  log.verbose("Waiting for GRPC channel to connect")
568
581
  grpc.channel_ready_future(channel).result()
569
582
  log.verbose("GRPC channel established: {}", address.netloc)
@@ -159,7 +159,7 @@ def publish_artifact():
159
159
  executor.run(env)
160
160
  jolt_url = acache.location(task.artifacts[0])
161
161
  raise_error_if(not jolt_url, "Failed to deploy jolt to a remote cache")
162
- cacheUrl = config.get("http", "uri", config.get("cache", "uri", "") + "/files")
162
+ cacheUrl = config.get("http", "uri", config.get("cache", "http_uri", config.get("cache", "uri", "")) + "/files")
163
163
  substituteUrl = config.get("selfdeploy", "baseUri")
164
164
  if cacheUrl and substituteUrl:
165
165
  return task.identity, jolt_url.replace(cacheUrl, substituteUrl)
@@ -1,3 +1,4 @@
1
+ from datetime import timedelta
1
2
  import blake3
2
3
  import contextlib
3
4
  import ctypes
@@ -725,3 +726,40 @@ def platform_os_arch():
725
726
  f"Unsupported platform: {uname.system} {uname.machine}"
726
727
  ) from None
727
728
  return system, architecture
729
+
730
+
731
+ def parse_duration(value: str) -> timedelta:
732
+ """ Parses a duration string into a timedelta object.
733
+
734
+ Supported formats are:
735
+ - Nms (milliseconds)
736
+ - Ns (seconds)
737
+ - Nm (minutes)
738
+ - Nh (hours)
739
+ - Nd (days)
740
+ - Nw (weeks)
741
+
742
+ Where N is an integer.
743
+ """
744
+ pattern = r"^(?P<value>\d+)(?P<unit>s|m|h|d|w)$"
745
+ match = re.match(pattern, value)
746
+ if not match:
747
+ raise ValueError(f"Invalid duration format: {value}")
748
+
749
+ value = int(match.group("value"))
750
+ unit = match.group("unit")
751
+
752
+ if unit == "ms":
753
+ return timedelta(milliseconds=value)
754
+ elif unit == "s":
755
+ return timedelta(seconds=value)
756
+ elif unit == "m":
757
+ return timedelta(minutes=value)
758
+ elif unit == "h":
759
+ return timedelta(hours=value)
760
+ elif unit == "d":
761
+ return timedelta(days=value)
762
+ elif unit == "w":
763
+ return timedelta(weeks=value)
764
+
765
+ raise ValueError(f"Unsupported duration unit: {unit}")
@@ -0,0 +1 @@
1
+ __version__ = "0.9.456"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jolt
3
- Version: 0.9.449
3
+ Version: 0.9.456
4
4
  Summary: A task executor
5
5
  Home-page: https://github.com/srand/jolt
6
6
  Author: Robert Andersson
@@ -1 +0,0 @@
1
- __version__ = "0.9.449"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes