jolt 0.9.123__py3-none-any.whl → 0.9.435__py3-none-any.whl

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 (196) hide show
  1. jolt/__init__.py +80 -7
  2. jolt/__main__.py +9 -1
  3. jolt/bin/fstree-darwin-x86_64 +0 -0
  4. jolt/bin/fstree-linux-x86_64 +0 -0
  5. jolt/cache.py +832 -362
  6. jolt/chroot.py +156 -0
  7. jolt/cli.py +281 -162
  8. jolt/common_pb2.py +63 -0
  9. jolt/common_pb2_grpc.py +4 -0
  10. jolt/config.py +98 -41
  11. jolt/error.py +19 -4
  12. jolt/filesystem.py +2 -6
  13. jolt/graph.py +705 -117
  14. jolt/hooks.py +43 -0
  15. jolt/influence.py +122 -3
  16. jolt/loader.py +369 -121
  17. jolt/log.py +225 -63
  18. jolt/manifest.py +28 -38
  19. jolt/options.py +35 -10
  20. jolt/pkgs/abseil.py +42 -0
  21. jolt/pkgs/asio.py +25 -0
  22. jolt/pkgs/autoconf.py +41 -0
  23. jolt/pkgs/automake.py +41 -0
  24. jolt/pkgs/b2.py +31 -0
  25. jolt/pkgs/boost.py +111 -0
  26. jolt/pkgs/boringssl.py +32 -0
  27. jolt/pkgs/busybox.py +39 -0
  28. jolt/pkgs/bzip2.py +43 -0
  29. jolt/pkgs/cares.py +29 -0
  30. jolt/pkgs/catch2.py +36 -0
  31. jolt/pkgs/cbindgen.py +17 -0
  32. jolt/pkgs/cista.py +19 -0
  33. jolt/pkgs/clang.py +44 -0
  34. jolt/pkgs/cli11.py +24 -0
  35. jolt/pkgs/cmake.py +48 -0
  36. jolt/pkgs/cpython.py +196 -0
  37. jolt/pkgs/crun.py +29 -0
  38. jolt/pkgs/curl.py +38 -0
  39. jolt/pkgs/dbus.py +18 -0
  40. jolt/pkgs/double_conversion.py +24 -0
  41. jolt/pkgs/fastfloat.py +21 -0
  42. jolt/pkgs/ffmpeg.py +28 -0
  43. jolt/pkgs/flatbuffers.py +29 -0
  44. jolt/pkgs/fmt.py +27 -0
  45. jolt/pkgs/fstree.py +20 -0
  46. jolt/pkgs/gflags.py +18 -0
  47. jolt/pkgs/glib.py +18 -0
  48. jolt/pkgs/glog.py +25 -0
  49. jolt/pkgs/glslang.py +21 -0
  50. jolt/pkgs/golang.py +16 -11
  51. jolt/pkgs/googlebenchmark.py +18 -0
  52. jolt/pkgs/googletest.py +46 -0
  53. jolt/pkgs/gperf.py +15 -0
  54. jolt/pkgs/grpc.py +73 -0
  55. jolt/pkgs/hdf5.py +19 -0
  56. jolt/pkgs/help2man.py +14 -0
  57. jolt/pkgs/inja.py +28 -0
  58. jolt/pkgs/jsoncpp.py +31 -0
  59. jolt/pkgs/libarchive.py +43 -0
  60. jolt/pkgs/libcap.py +44 -0
  61. jolt/pkgs/libdrm.py +44 -0
  62. jolt/pkgs/libedit.py +42 -0
  63. jolt/pkgs/libevent.py +31 -0
  64. jolt/pkgs/libexpat.py +27 -0
  65. jolt/pkgs/libfastjson.py +21 -0
  66. jolt/pkgs/libffi.py +16 -0
  67. jolt/pkgs/libglvnd.py +30 -0
  68. jolt/pkgs/libogg.py +28 -0
  69. jolt/pkgs/libpciaccess.py +18 -0
  70. jolt/pkgs/libseccomp.py +21 -0
  71. jolt/pkgs/libtirpc.py +24 -0
  72. jolt/pkgs/libtool.py +42 -0
  73. jolt/pkgs/libunwind.py +35 -0
  74. jolt/pkgs/libva.py +18 -0
  75. jolt/pkgs/libvorbis.py +33 -0
  76. jolt/pkgs/libxml2.py +35 -0
  77. jolt/pkgs/libxslt.py +17 -0
  78. jolt/pkgs/libyajl.py +16 -0
  79. jolt/pkgs/llvm.py +81 -0
  80. jolt/pkgs/lua.py +54 -0
  81. jolt/pkgs/lz4.py +26 -0
  82. jolt/pkgs/m4.py +14 -0
  83. jolt/pkgs/make.py +17 -0
  84. jolt/pkgs/mesa.py +81 -0
  85. jolt/pkgs/meson.py +17 -0
  86. jolt/pkgs/mstch.py +28 -0
  87. jolt/pkgs/mysql.py +60 -0
  88. jolt/pkgs/nasm.py +49 -0
  89. jolt/pkgs/ncurses.py +30 -0
  90. jolt/pkgs/ng_log.py +25 -0
  91. jolt/pkgs/ninja.py +45 -0
  92. jolt/pkgs/nlohmann_json.py +25 -0
  93. jolt/pkgs/nodejs.py +19 -11
  94. jolt/pkgs/opencv.py +24 -0
  95. jolt/pkgs/openjdk.py +26 -0
  96. jolt/pkgs/openssl.py +103 -0
  97. jolt/pkgs/paho.py +76 -0
  98. jolt/pkgs/patchelf.py +16 -0
  99. jolt/pkgs/perl.py +42 -0
  100. jolt/pkgs/pkgconfig.py +64 -0
  101. jolt/pkgs/poco.py +39 -0
  102. jolt/pkgs/protobuf.py +77 -0
  103. jolt/pkgs/pugixml.py +27 -0
  104. jolt/pkgs/python.py +19 -0
  105. jolt/pkgs/qt.py +35 -0
  106. jolt/pkgs/rapidjson.py +26 -0
  107. jolt/pkgs/rapidyaml.py +28 -0
  108. jolt/pkgs/re2.py +30 -0
  109. jolt/pkgs/re2c.py +17 -0
  110. jolt/pkgs/readline.py +15 -0
  111. jolt/pkgs/rust.py +41 -0
  112. jolt/pkgs/sdl.py +28 -0
  113. jolt/pkgs/simdjson.py +27 -0
  114. jolt/pkgs/soci.py +46 -0
  115. jolt/pkgs/spdlog.py +29 -0
  116. jolt/pkgs/spirv_llvm.py +21 -0
  117. jolt/pkgs/spirv_tools.py +24 -0
  118. jolt/pkgs/sqlite.py +83 -0
  119. jolt/pkgs/ssl.py +12 -0
  120. jolt/pkgs/texinfo.py +15 -0
  121. jolt/pkgs/tomlplusplus.py +22 -0
  122. jolt/pkgs/wayland.py +26 -0
  123. jolt/pkgs/x11.py +58 -0
  124. jolt/pkgs/xerces_c.py +20 -0
  125. jolt/pkgs/xorg.py +360 -0
  126. jolt/pkgs/xz.py +29 -0
  127. jolt/pkgs/yamlcpp.py +30 -0
  128. jolt/pkgs/zeromq.py +47 -0
  129. jolt/pkgs/zlib.py +87 -0
  130. jolt/pkgs/zstd.py +33 -0
  131. jolt/plugins/alias.py +3 -0
  132. jolt/plugins/allure.py +5 -2
  133. jolt/plugins/autotools.py +66 -0
  134. jolt/plugins/cache.py +133 -0
  135. jolt/plugins/cmake.py +74 -6
  136. jolt/plugins/conan.py +238 -0
  137. jolt/plugins/cxx.py +698 -0
  138. jolt/plugins/cxxinfo.py +7 -0
  139. jolt/plugins/dashboard.py +1 -1
  140. jolt/plugins/docker.py +80 -23
  141. jolt/plugins/email.py +2 -2
  142. jolt/plugins/email.xslt +144 -101
  143. jolt/plugins/environ.py +11 -0
  144. jolt/plugins/fetch.py +141 -0
  145. jolt/plugins/gdb.py +39 -19
  146. jolt/plugins/gerrit.py +1 -14
  147. jolt/plugins/git.py +283 -85
  148. jolt/plugins/googletest.py +2 -1
  149. jolt/plugins/http.py +36 -38
  150. jolt/plugins/libtool.py +63 -0
  151. jolt/plugins/linux.py +990 -0
  152. jolt/plugins/logstash.py +4 -4
  153. jolt/plugins/meson.py +61 -0
  154. jolt/plugins/ninja-compdb.py +99 -30
  155. jolt/plugins/ninja.py +468 -166
  156. jolt/plugins/paths.py +11 -1
  157. jolt/plugins/pkgconfig.py +219 -0
  158. jolt/plugins/podman.py +136 -92
  159. jolt/plugins/python.py +137 -0
  160. jolt/plugins/remote_execution/__init__.py +0 -0
  161. jolt/plugins/remote_execution/administration_pb2.py +46 -0
  162. jolt/plugins/remote_execution/administration_pb2_grpc.py +170 -0
  163. jolt/plugins/remote_execution/log_pb2.py +32 -0
  164. jolt/plugins/remote_execution/log_pb2_grpc.py +68 -0
  165. jolt/plugins/remote_execution/scheduler_pb2.py +41 -0
  166. jolt/plugins/remote_execution/scheduler_pb2_grpc.py +141 -0
  167. jolt/plugins/remote_execution/worker_pb2.py +38 -0
  168. jolt/plugins/remote_execution/worker_pb2_grpc.py +112 -0
  169. jolt/plugins/report.py +12 -2
  170. jolt/plugins/rust.py +25 -0
  171. jolt/plugins/scheduler.py +710 -0
  172. jolt/plugins/selfdeploy/setup.py +8 -4
  173. jolt/plugins/selfdeploy.py +138 -88
  174. jolt/plugins/strings.py +35 -22
  175. jolt/plugins/symlinks.py +26 -11
  176. jolt/plugins/telemetry.py +5 -2
  177. jolt/plugins/timeline.py +13 -3
  178. jolt/plugins/volume.py +46 -48
  179. jolt/scheduler.py +589 -192
  180. jolt/tasks.py +625 -121
  181. jolt/templates/timeline.html.template +44 -47
  182. jolt/timer.py +22 -0
  183. jolt/tools.py +638 -282
  184. jolt/utils.py +211 -7
  185. jolt/version.py +1 -1
  186. jolt/xmldom.py +12 -2
  187. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/METADATA +97 -38
  188. jolt-0.9.435.dist-info/RECORD +207 -0
  189. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/WHEEL +1 -1
  190. jolt/plugins/amqp.py +0 -834
  191. jolt/plugins/debian.py +0 -338
  192. jolt/plugins/ftp.py +0 -181
  193. jolt/plugins/repo.py +0 -253
  194. jolt-0.9.123.dist-info/RECORD +0 -77
  195. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/entry_points.txt +0 -0
  196. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/top_level.txt +0 -0
jolt/utils.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ import ctypes
2
3
  import fnmatch
3
4
  import re
4
5
  import time
@@ -10,6 +11,9 @@ import os
10
11
  import hashlib
11
12
  from fasteners import lock, process_lock
12
13
  import json
14
+ import platform
15
+ import signal
16
+ import threading
13
17
 
14
18
 
15
19
  read_input = input
@@ -86,7 +90,7 @@ def as_stable_tuple_list(o):
86
90
 
87
91
 
88
92
  def as_human_size(size):
89
- unit_precision = [("B", 0), ("KB", 0), ("MB", 1), ("GB", 2), ("TB", 2), ("PB", 2)]
93
+ unit_precision = [("B", 0), ("KiB", 0), ("MiB", 1), ("GiB", 2), ("TiB", 2), ("PiB", 2), ("EiB", 2)]
90
94
  index = 0
91
95
  while size > 1024:
92
96
  size /= 1024
@@ -127,12 +131,13 @@ def call_and_catch_and_log(f, *args, **kwargs):
127
131
 
128
132
 
129
133
  def parse_aliased_task_name(name):
130
- match = re.match(r"^((?P<alias>[^=:]+)=)?(?P<task>[^:]+)(:(?P<params>.*))?$", name)
134
+ match = re.match(r"^((?P<alias>[^=:]+)=)?((?P<artifact>[^@=:]+)@)?(?P<task>[^:]+)(:(?P<params>.*))?$", name)
131
135
  if not match:
132
136
  from jolt.error import raise_error
133
137
  raise_error("Illegal task name: {}", name)
134
138
  match = match.groupdict()
135
139
  alias = match["alias"]
140
+ artifact = match["artifact"]
136
141
  task = match["task"]
137
142
  params = match["params"] or {}
138
143
 
@@ -148,15 +153,17 @@ def parse_aliased_task_name(name):
148
153
 
149
154
  params = {key: value for key, value in map(_param, params) if key}
150
155
 
151
- return alias, task, params
156
+ return alias, artifact, task, params
152
157
 
153
158
 
154
159
  def parse_task_name(name):
155
- _, task, params = parse_aliased_task_name(name)
160
+ _, _, task, params = parse_aliased_task_name(name)
156
161
  return task, params
157
162
 
158
163
 
159
- def format_task_name(name, params):
164
+ def format_task_name(name, params, artifact=None):
165
+ if artifact:
166
+ name = f"{artifact}@{name}"
160
167
  if not params:
161
168
  return name
162
169
 
@@ -212,6 +219,10 @@ class _SafeDict(object):
212
219
  value = self.values.get(key)
213
220
  if value is None:
214
221
  value = call_and_catch(getattr, self.values.get("_instance", object()), key)
222
+ if value is None and key == "buildroot":
223
+ tools = getattr(self.values.get("_instance", object()), "tools", None)
224
+ if tools:
225
+ value = tools.buildroot
215
226
  if value is None:
216
227
  value = self._envget(key)
217
228
  if type(value) is list:
@@ -231,6 +242,8 @@ class JoltFormatter(Formatter):
231
242
  return str(value).lower()
232
243
  elif conversion == "c":
233
244
  return value()
245
+ elif conversion == "t":
246
+ return str(value).title()
234
247
  elif conversion == "j":
235
248
  return " ".join(value)
236
249
  return super().convert_field(value, conversion)
@@ -313,19 +326,24 @@ class cached:
313
326
 
314
327
  @staticmethod
315
328
  def instance(f):
329
+ f.__cached_mutex = RLock()
330
+
316
331
  def _f(self, *args, **kwargs):
317
332
  attr = "__cached_result_" + str(id(f))
318
- with cached.mutex:
333
+ with f.__cached_mutex:
319
334
  if not hasattr(self, attr):
320
335
  setattr(self, attr, f(self, *args, **kwargs))
321
336
  return getattr(self, attr)
337
+
322
338
  return _f
323
339
 
324
340
  @staticmethod
325
341
  def method(f):
342
+ f.__cached_mutex = RLock()
343
+
326
344
  def _f(*args, **kwargs):
327
345
  attr = "__cached_result_" + str(id(f))
328
- with cached.mutex:
346
+ with f.__cached_mutex:
329
347
  if not hasattr(f, attr):
330
348
  setattr(f, attr, f(*args, **kwargs))
331
349
  return getattr(f, attr)
@@ -357,6 +375,73 @@ def ignore_exception(exc=Exception):
357
375
  return contextlib.suppress(exc)
358
376
 
359
377
 
378
+ class SignalHandler(object):
379
+ def __init__(self, signum):
380
+ self.original_handler = signal.signal(signum, self._handler)
381
+ self.handlers = []
382
+
383
+ def _handler(self, signum, frame):
384
+ for handler in self.handlers:
385
+ handler.add_signal(signum, frame)
386
+ if not self.handlers and self.original_handler:
387
+ self.original_handler(signum, frame)
388
+
389
+ def new_monitor(self):
390
+ class Finalizer(object):
391
+ def __init__(self, handler):
392
+ self.handler = handler
393
+ self.signals = []
394
+
395
+ def add_signal(self, signum, frame):
396
+ self.signals.append((signum, frame))
397
+
398
+ def __call__(self):
399
+ self.handler.handlers.remove(self)
400
+ for signum, frame in self.signals:
401
+ self.handler.original_handler(signum, frame)
402
+
403
+ finalizer = Finalizer(self)
404
+ self.handlers.append(finalizer)
405
+ return finalizer
406
+
407
+
408
+ sigint_handler = SignalHandler(signal.SIGINT)
409
+
410
+
411
+ @contextlib.contextmanager
412
+ def delayed_signal(signum):
413
+ """ A context manager that delays signals until after the code block. """
414
+
415
+ finalize = sigint_handler.new_monitor()
416
+ try:
417
+ yield
418
+ finally:
419
+ finalize()
420
+
421
+
422
+ @contextlib.contextmanager
423
+ def delayed_interrupt():
424
+ if hasattr(signal, 'pthread_sigmask'):
425
+ try:
426
+ # Temporarily block the SIGINT signal
427
+ signal.pthread_sigmask(signal.SIG_BLOCK, {signal.SIGINT})
428
+ yield
429
+ finally:
430
+ # Unblock the SIGINT signal after the code block
431
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, {signal.SIGINT})
432
+ else:
433
+ # Fallback for systems without pthread_sigmask
434
+ yield
435
+
436
+
437
+ def delay_interrupt(func):
438
+ @wraps(func)
439
+ def _f(*args, **kwargs):
440
+ with delayed_interrupt():
441
+ return func(*args, **kwargs)
442
+ return _f
443
+
444
+
360
445
  def Singleton(cls):
361
446
  cls._instance = None
362
447
 
@@ -370,6 +455,28 @@ def Singleton(cls):
370
455
  return cls
371
456
 
372
457
 
458
+ class IdLock(object):
459
+ """ A wrapper for multiple thread locks that are identified by a unique id. """
460
+
461
+ def __init__(self):
462
+ self._lock = RLock()
463
+ self._locks = {}
464
+
465
+ def acquire(self, id, blocking=True):
466
+ with self._lock:
467
+ if id not in self._locks:
468
+ self._locks[id] = RLock()
469
+ lock = self._locks[id]
470
+ return lock.acquire(blocking=blocking)
471
+
472
+ def release(self, id):
473
+ with self._lock:
474
+ if id in self._locks:
475
+ self._locks[id].release()
476
+ else:
477
+ raise RuntimeError("Lock not acquired: {}".format(id))
478
+
479
+
373
480
  class LockFile(object):
374
481
  def __init__(self, path, logfunc=None, *args, **kwargs):
375
482
  self._file = process_lock.InterProcessLock(os.path.join(path, "lock"))
@@ -507,3 +614,100 @@ def quote(value, char='"'):
507
614
 
508
615
  def option(prefix, value):
509
616
  return "{}{}".format(prefix, quote(value)) if value else ""
617
+
618
+
619
+ def shorten(string, count=30):
620
+ if len(string) > count:
621
+ keep = int(count / 2 - 1)
622
+ if keep <= 0:
623
+ keep = 1
624
+ return string[:keep] + "..." + string[-keep + 1:]
625
+ return string
626
+
627
+
628
+ def prefix(value, pfx):
629
+ if type(value) is list:
630
+ return [pfx + item for item in value]
631
+ return pfx + value
632
+
633
+
634
+ def suffix(value, sfx):
635
+ if type(value) is list:
636
+ return [item + sfx for item in value]
637
+ return value + sfx
638
+
639
+
640
+ def hostname():
641
+ """ Returns the hostname of the machine. """
642
+ import socket
643
+ return socket.gethostname()
644
+
645
+
646
+ def timeout(seconds, exception_type):
647
+ """ A context manager that enforces a timeout.
648
+
649
+ If the block of code takes longer than the specified timeout,
650
+ the context manager will raise an asyncronous TimeoutError.
651
+ """
652
+
653
+ class TimeoutContext(object):
654
+ def __init__(self, timeout, exception_type):
655
+ self._timer = threading.Timer(timeout, self._raise_timeout)
656
+ self._tid = threading.current_thread().ident
657
+ self._exc = exception_type
658
+
659
+ def _raise_timeout(self):
660
+ tid = ctypes.c_ulong(self._tid)
661
+ ret = ctypes.pythonapi.PyThreadState_SetAsyncExc(
662
+ tid, ctypes.py_object(self._exc))
663
+
664
+ if ret == 0:
665
+ raise ValueError("Invalid thread ID {self._tid}")
666
+ elif ret > 1:
667
+ ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
668
+ raise SystemError("PyThreadState_SetAsyncExc failed")
669
+
670
+ def __enter__(self):
671
+ self._timer.start()
672
+ return self
673
+
674
+ def __exit__(self, exc_type, exc_value, traceback):
675
+ self._timer.cancel()
676
+ return None
677
+
678
+ return TimeoutContext(seconds, exception_type)
679
+
680
+
681
+ def platform_os_arch():
682
+ """
683
+ Returns the name of the operating system and architecture.
684
+
685
+ The values match the GOOS and GOARCH environment variables used by Go.
686
+ """
687
+ _ARCHITECTURE_DICT = {
688
+ "Windows": {
689
+ "AMD64": "amd64",
690
+ "X86": "386",
691
+ "ARM64": "arm64",
692
+ },
693
+ "Linux": {
694
+ "x86_64": "amd64",
695
+ "i686": "386",
696
+ "i386": "386",
697
+ "aarch64": "arm64",
698
+ "armv7l": "armv7",
699
+ },
700
+ "Darwin": {
701
+ "x86_64": "amd64",
702
+ "arm64": "arm64",
703
+ },
704
+ }
705
+ uname = platform.uname()
706
+ try:
707
+ system = uname.system.lower()
708
+ architecture = _ARCHITECTURE_DICT[uname.system][uname.machine]
709
+ except KeyError:
710
+ raise RuntimeError(
711
+ f"Unsupported platform: {uname.system} {uname.machine}"
712
+ ) from None
713
+ return system, architecture
jolt/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.9.123"
1
+ __version__ = "0.9.435"
jolt/xmldom.py CHANGED
@@ -49,6 +49,9 @@ class SubElement(object):
49
49
  def iter(self, *args, **kwargs):
50
50
  return self._elem.iter(*args, **kwargs)
51
51
 
52
+ def remove(self, *args, **kwargs):
53
+ return self._elem.remove(*args, **kwargs)
54
+
52
55
 
53
56
  class Attribute(object):
54
57
  def __init__(self, attribute, varname=None, child=False, values=None, base64=False, zlib=False):
@@ -147,8 +150,8 @@ class Composition(object):
147
150
  self.append(child)
148
151
  return child
149
152
 
150
- def remove(self, child, *args, **kwargs):
151
- self.remove(child._elem)
153
+ def remove(self, *args, **kwargs):
154
+ self.remove(*args, **kwargs)
152
155
 
153
156
  @property
154
157
  def get(self):
@@ -156,6 +159,13 @@ class Composition(object):
156
159
  children = [n for n in children if n.tag == name]
157
160
  return [comp_cls(elem=child) for child in children]
158
161
 
162
+ def clear(self):
163
+ children = list(self.getroot()) if isinstance(self, ElementTree) else list(self._elem)
164
+ children = [n for n in children if n.tag == name]
165
+ for child in children:
166
+ getattr(self, "remove_" + name)(child)
167
+
168
+ setattr(cls, 'clear_' + name + "s", clear)
159
169
  setattr(cls, 'create_' + name, create)
160
170
  setattr(cls, 'remove_' + name, remove)
161
171
  setattr(cls, name + 's', get)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: jolt
3
- Version: 0.9.123
3
+ Version: 0.9.435
4
4
  Summary: A task executor
5
5
  Home-page: https://github.com/srand/jolt
6
6
  Author: Robert Andersson
@@ -21,47 +21,106 @@ Classifier: Programming Language :: Java
21
21
  Classifier: Programming Language :: JavaScript
22
22
  Classifier: Programming Language :: Python :: 3
23
23
  Requires-Python: >=3.8
24
- Requires-Dist: tqdm ==4.66.1
25
- Requires-Dist: requests ==2.31.0
26
- Requires-Dist: certifi ==2023.7.22
27
- Requires-Dist: urllib3 ==1.26.16
28
- Requires-Dist: idna ==3.4
29
- Requires-Dist: charset-normalizer ==3.2.0
30
- Requires-Dist: pygit2 ==1.12.2
31
- Requires-Dist: cffi ==1.15.1
32
- Requires-Dist: pycparser ==2.21
33
- Requires-Dist: psutil ==5.9.5
34
- Requires-Dist: ninja-syntax ==1.7.2
35
- Requires-Dist: multi-key-dict ==2.0.3
36
- Requires-Dist: lxml ==4.9.3
37
- Requires-Dist: keyrings.alt ==5.0.0
38
- Requires-Dist: jaraco.classes ==3.3.0
39
- Requires-Dist: more-itertools ==10.1.0
40
- Requires-Dist: keyring ==24.2.0
41
- Requires-Dist: jeepney ==0.8.0
42
- Requires-Dist: SecretStorage ==3.3.3
43
- Requires-Dist: cryptography ==41.0.3
44
- Requires-Dist: importlib-metadata ==6.8.0
45
- Requires-Dist: zipp ==3.16.2
46
- Requires-Dist: Jinja2 ==3.1.2
47
- Requires-Dist: MarkupSafe ==2.1.3
48
- Requires-Dist: fasteners ==0.18
49
- Requires-Dist: colorama ==0.4.6
50
- Requires-Dist: click ==8.1.7
51
- Requires-Dist: bz2file ==0.98
24
+ Requires-Dist: Jinja2==3.1.4
25
+ Requires-Dist: Jinja2==3.1.4
26
+ Requires-Dist: MarkupSafe==2.1.5
27
+ Requires-Dist: PyJWT==2.9.0
28
+ Requires-Dist: PyYAML==6.0.2
29
+ Requires-Dist: PyYAML==6.0.2
30
+ Requires-Dist: Pygments==2.18.0
31
+ Requires-Dist: Pygments==2.18.0
32
+ Requires-Dist: SecretStorage==3.3.3
33
+ Requires-Dist: allure-python-commons==2.13.5
34
+ Requires-Dist: attrs==24.2.0
35
+ Requires-Dist: backports.tarfile==1.2.0
36
+ Requires-Dist: bottle==0.12.25
37
+ Requires-Dist: brotli==1.2.0
38
+ Requires-Dist: bz2file==0.98
39
+ Requires-Dist: certifi==2024.8.30
40
+ Requires-Dist: cffi==1.17.1
41
+ Requires-Dist: charset-normalizer==3.3.2
42
+ Requires-Dist: click==8.1.7
43
+ Requires-Dist: colorama==0.4.6
44
+ Requires-Dist: conan==2.10.2
45
+ Requires-Dist: cryptography==43.0.1
46
+ Requires-Dist: distro==1.8.0
47
+ Requires-Dist: docutils==0.21.2
48
+ Requires-Dist: fasteners==0.19
49
+ Requires-Dist: flake8==7.1.1
50
+ Requires-Dist: grpcio==1.66.1
51
+ Requires-Dist: id==1.5.0
52
+ Requires-Dist: idna==3.10
53
+ Requires-Dist: importlib_metadata==8.5.0
54
+ Requires-Dist: importlib_metadata==8.5.0
55
+ Requires-Dist: inflate64==1.0.4
56
+ Requires-Dist: jaraco.classes==3.4.0
57
+ Requires-Dist: jaraco.context==6.0.1
58
+ Requires-Dist: jaraco.functools==4.0.2
59
+ Requires-Dist: jeepney==0.8.0
60
+ Requires-Dist: keyring==25.4.1
61
+ Requires-Dist: keyrings.alt==5.0.2
62
+ Requires-Dist: lxml==5.3.0
63
+ Requires-Dist: markdown-it-py==3.0.0
64
+ Requires-Dist: mccabe==0.7.0
65
+ Requires-Dist: more-itertools==10.5.0
66
+ Requires-Dist: more-itertools==10.5.0
67
+ Requires-Dist: multi_key_dict==2.0.3
68
+ Requires-Dist: multivolumefile==0.2.3
69
+ Requires-Dist: nh3==0.2.19
70
+ Requires-Dist: ninja==1.11.1.1
71
+ Requires-Dist: packaging==24.2
72
+ Requires-Dist: patch-ng==1.18.1
73
+ Requires-Dist: pip==25.3
74
+ Requires-Dist: pluggy==1.5.0
75
+ Requires-Dist: pluginbase==1.0.1
76
+ Requires-Dist: protobuf==5.28.2
77
+ Requires-Dist: psutil==6.0.0
78
+ Requires-Dist: py7zr==1.0.0
79
+ Requires-Dist: pybcj==1.0.6
80
+ Requires-Dist: pycodestyle==2.12.1
81
+ Requires-Dist: pycparser==2.22
82
+ Requires-Dist: pycryptodomex==3.23.0
83
+ Requires-Dist: pyflakes==3.2.0
84
+ Requires-Dist: pygit2==1.15.1
85
+ Requires-Dist: pyppmd==1.2.0
86
+ Requires-Dist: python-dateutil==2.9.0.post0
87
+ Requires-Dist: pyzstd==0.18.0
88
+ Requires-Dist: readme_renderer==44.0
89
+ Requires-Dist: requests-toolbelt==1.0.0
90
+ Requires-Dist: requests==2.32.3
91
+ Requires-Dist: rfc3986==2.0.0
92
+ Requires-Dist: rich==13.9.4
93
+ Requires-Dist: setuptools==80.9.0
94
+ Requires-Dist: six==1.16.0
95
+ Requires-Dist: texttable==1.7.0
96
+ Requires-Dist: tqdm==4.66.5
97
+ Requires-Dist: twine==6.2.0
98
+ Requires-Dist: typing_extensions==4.15.0
99
+ Requires-Dist: urllib3==1.26.20
100
+ Requires-Dist: wheel==0.45.1
101
+ Requires-Dist: zipp==3.20.2
102
+ Requires-Dist: zstandard==0.23.0
52
103
  Provides-Extra: allure
53
- Requires-Dist: allure-python-commons ; extra == 'allure'
54
- Provides-Extra: amqp
55
- Requires-Dist: pika ; extra == 'amqp'
104
+ Requires-Dist: allure-python-commons; extra == "allure"
56
105
  Provides-Extra: conan
57
- Requires-Dist: conan <2.0 ; extra == 'conan'
106
+ Requires-Dist: conan>=2.0; extra == "conan"
58
107
  Provides-Extra: dev
59
- Requires-Dist: check-manifest ; extra == 'dev'
108
+ Requires-Dist: check-manifest; extra == "dev"
60
109
  Provides-Extra: doc
61
- Requires-Dist: sphinx-click ; extra == 'doc'
62
- Requires-Dist: sphinx-rtd-theme ; extra == 'doc'
110
+ Requires-Dist: sphinx-click; extra == "doc"
111
+ Requires-Dist: sphinx-rtd-theme; extra == "doc"
63
112
  Provides-Extra: test
64
- Requires-Dist: coverage ; extra == 'test'
113
+ Requires-Dist: coverage; extra == "test"
114
+ Dynamic: author
115
+ Dynamic: author-email
116
+ Dynamic: classifier
117
+ Dynamic: description
118
+ Dynamic: home-page
119
+ Dynamic: keywords
120
+ Dynamic: provides-extra
121
+ Dynamic: requires-dist
122
+ Dynamic: requires-python
123
+ Dynamic: summary
65
124
 
66
125
  Jolt
67
126
  ============================