From d1226719e2a4148d47c3aa2f9a24b97437fe1e4b Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Fri, 31 Oct 2025 16:07:17 +0100 Subject: [PATCH] Betterproto seems slower --- pyproject.toml | 3 + trap/lidar_tracker.py | 6 +- trap/lines.py | 137 +++++++++++++++------- trap/protobuf/__init__.py | 0 trap/protobuf/renderable.py | 68 +++++++++++ trap/renderable_pb2.py | 41 +++++++ trap/stage.py | 33 +++++- uv.lock | 219 ++++++++++++++++++++++++++++++++---- 8 files changed, 438 insertions(+), 69 deletions(-) create mode 100644 trap/protobuf/__init__.py create mode 100644 trap/protobuf/renderable.py create mode 100644 trap/renderable_pb2.py diff --git a/pyproject.toml b/pyproject.toml index b18cee4..e15cb26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,9 @@ dependencies = [ "velodyne-decoder>=3.1.0", "open3d>=0.19.0", "nptyping>=2.5.0", + "py-to-proto>=0.6.0", + "grpcio-tools>=1.76.0", + "betterproto[compiler]>=1.2.5", ] [project.scripts] diff --git a/trap/lidar_tracker.py b/trap/lidar_tracker.py index 0bd067f..cbda039 100644 --- a/trap/lidar_tracker.py +++ b/trap/lidar_tracker.py @@ -41,7 +41,7 @@ def read_live_data(ip, port, config, as_pcl_structs=False): while True: readable, _, _ = select.select([sock], [], [], 1.0) - latest_data = {} + latest_result = {} if sock in readable: # Drain all packets, keep only the last one, this prevents buffer build-up @@ -52,11 +52,11 @@ def read_live_data(ip, port, config, as_pcl_structs=False): recv_stamp = time.time() result = decoder.decode(recv_stamp, data, as_pcl_structs) if result is not None: - latest_data[addr] = ResultTuple(*result) + latest_result[addr] = ResultTuple(*result) except BlockingIOError: break # No more packets in the queue - for addr, data in latest_data.items(): + for addr, data in latest_result.items(): yield data else: logger.warning("No LiDAR data in the last second.") diff --git a/trap/lines.py b/trap/lines.py index 91bdfd6..e3a1d8a 100644 --- a/trap/lines.py +++ b/trap/lines.py @@ -20,29 +20,38 @@ import svgpathtools from noise import snoise2 +from trap import renderable_pb2 from trap.utils import exponentialDecayRounded, inv_lerp +from trap.protobuf import renderable + """ See [notebook](../test_path_transforms.ipynb) for examples """ -RenderablePosition = Tuple[float,float] +@dataclass +class RenderablePosition( renderable.RenderablePosition): # Tuple[float,float] + def to_tuple(self ): + return (self.x, self.y) + Coordinate = Tuple[float, float] DeltaT = float # delta_t in seconds -class CoordinateSpace(IntEnum): - CAMERA = 1 - UNDISTORTED_CAMERA = 2 - WORLD = 3 - LASER = 4 +CoordinateSpace = renderable.CoordinateSpace +# class CoordinateSpace(renderable.CoordinateSpace): +# pass + # CAMERA = 1 + # UNDISTORTED_CAMERA = 2 + # WORLD = 3 + # LASER = 4 @dataclass -class SrgbaColor(): - red: float - green: float - blue: float - alpha: float +class SrgbaColor(renderable.SrgbaColor): + # red: float + # green: float + # blue: float + # alpha: float def with_alpha(self, alpha: float) -> SrgbaColor: return SrgbaColor(self.red, self.green, self.blue, alpha) @@ -51,20 +60,28 @@ class SrgbaColor(): return SrgbaColor(self.red, self.green, self.blue, self.alpha * alpha) def __eq__(self, other): + if not isinstance(other, SrgbaColor): + return False return math.isclose(self.red, other.red) and math.isclose(self.green, other.green) and math.isclose(self.blue, other.blue) and math.isclose(self.alpha, other.alpha) @dataclass -class RenderablePoint(): - position: RenderablePosition - color: SrgbaColor +class RenderablePoint(renderable.RenderablePoint): + # position: RenderablePosition + # color: SrgbaColor def __post_init__(self): if type(self.position) is np.ndarray: # convert if wrong type, so it can be serialised # print('convert') - self.position = tuple(self.position.tolist()) + self.position = RenderablePosition(*self.position.tolist()) + # self.position = tuple(self.position.tolist()) # self.position = (float(self.position[0]), float(self.position[0])) + if type(self.position) is tuple: + self.position = RenderablePosition(*self.position) + + + super().__post_init__() # pass @classmethod @@ -79,14 +96,14 @@ class SimplifyMethod(Enum): VW = 2 # Visvalingam-Whyatt @dataclass -class RenderableLine(): - points: List[RenderablePoint] +class RenderableLine(renderable.RenderableLine): + # points: List[RenderablePoint] def __len__(self): return len(self.points) def as_simplified(self, method: SimplifyMethod = SimplifyMethod.RDP, factor = SIMPLIFY_FACTOR_RDP): - linestring = [p.position for p in self.points] + linestring = [p.position.to_tuple() for p in self.points] if method == SimplifyMethod.RDP: indexes = simplify_coords_idx(linestring, factor) elif method == SimplifyMethod.VW: @@ -95,7 +112,7 @@ class RenderableLine(): return RenderableLine(points) def as_linestring(self): - return shapely.geometry.LineString([p.position for p in self.points]) + return shapely.geometry.LineString([p.position.to_tuple() for p in self.points]) @classmethod def from_multilinestring(cls, mls: shapely.geometry.MultiLineString, color: SrgbaColor) -> RenderableLine: @@ -109,7 +126,7 @@ class RenderableLine(): # blank point if not is_first: - points.append(RenderablePoint(line.coords[0], color.as_faded(0))) + points.append(RenderablePoint(RenderablePosition(*line.coords[0]), color.as_faded(0))) points.extend( [RenderablePoint(pos, color) for pos in line.coords] @@ -117,21 +134,21 @@ class RenderableLine(): # blank point if not is_last: - points.append(RenderablePoint(line.coords[-1], color.as_faded(0))) + points.append(RenderablePoint(RenderablePosition(*line.coords[-1]), color.as_faded(0))) return RenderableLine(points) @classmethod def from_linestring(cls, ls: shapely.geometry.LineString, color: SrgbaColor) -> RenderableLine: points: List[RenderablePoint] = [] for coord in ls.coords: - points.append(RenderablePoint(coord, color)) + points.append(RenderablePoint(RenderablePosition(*coord), color)) return RenderableLine(points) @dataclass -class RenderableLines(): - lines: List[RenderableLine] - space: CoordinateSpace = CoordinateSpace.WORLD +class RenderableLines(renderable.RenderableLines): + # lines: List[RenderableLine] + # space: CoordinateSpace = CoordinateSpace.WORLD def as_simplified(self, method: SimplifyMethod = SimplifyMethod.RDP, factor = SIMPLIFY_FACTOR_RDP): """Wraps RenderableLine simplification, smaller factor is more detailed""" @@ -150,7 +167,9 @@ class RenderableLines(): # def merge(self, rl: RenderableLines): -RenderableLayers = Dict[int, RenderableLines] +# RenderableLayers = Dict[int, RenderableLines] + +RenderableLayers = renderable.RenderableLayers def circle_arc(cx, cy, r, t, l, c: SrgbaColor): """ @@ -166,7 +185,7 @@ def circle_arc(cx, cy, r, t, l, c: SrgbaColor): x = cx + math.cos(i * (2*math.pi)/resolution) * r y = cy + math.sin(i * (2*math.pi)/resolution)* r - pointlist.append(RenderablePoint((x, y), c)) + pointlist.append(RenderablePoint(RenderablePosition(x, y), c)) return RenderableLine(pointlist) @@ -179,14 +198,14 @@ def cross_points(cx, cy, r, c: SrgbaColor): x = int(cx) y = int(cy + r - i * 2 * r/steps) pos = (x, y) - pointlist.append(RenderablePoint(pos, c)) + pointlist.append(RenderablePoint(RenderablePosition(*pos), c)) path = RenderableLine(pointlist) pointlist: list[RenderablePoint] = [] for i in range(steps): y = int(cy) x = int(cx + r - i * 2 * r/steps) pos = (x, y) - pointlist.append(RenderablePoint(pos, c)) + pointlist.append(RenderablePoint(RenderablePosition(*pos), c)) path2 = RenderableLine(pointlist) return [path, path2] @@ -242,7 +261,7 @@ def load_lines_from_svg(svg_path: Path, scale: float, c: SrgbaColor, max_len = 0 linestring = shapely.segmentize(linestring, max_len) - points = [RenderablePoint(pos, c) for pos in linestring.coords] + points = [RenderablePoint(RenderablePosition(*pos), c) for pos in linestring.coords] line = RenderableLine(points) lines.append(line) # linestrings.append(linestring) @@ -263,7 +282,7 @@ class LineGenerator(ABC): def as_renderable(self, dt: DeltaT, color: SrgbaColor) -> RenderableLines: - points = [RenderablePoint(p, color) for p in self.get_drawn_points(dt)] + points = [RenderablePoint(RenderablePosition(*p), color) for p in self.get_drawn_points(dt)] lines = [RenderableLine(points)] return RenderableLines(lines) @@ -435,7 +454,7 @@ class StaticLine(): self.points.extend(coords) def as_renderable_line(self, dt: DeltaT) -> RenderableLine: - points = [RenderablePoint(p, self.color) for p in self.points] + points = [RenderablePoint(RenderablePosition(*p), self.color) for p in self.points] line = RenderableLine(points) return line @@ -522,7 +541,7 @@ class AppendableLineAnimator(LineAnimator): idx = len(self.drawn_points) - 1 target = target_line.points[idx] - if np.isclose(self.drawn_points[-1].position, target.position, atol=.05).all(): + if np.isclose(self.drawn_points[-1].position.to_tuple(), target.position.to_tuple(), atol=.05).all(): # TODO: might want to migrate to np.isclose() if len(self.drawn_points) == len(target_line): self.ready = True @@ -535,8 +554,8 @@ class AppendableLineAnimator(LineAnimator): self.ready = False decay_speed = self.draw_decay_speed if self.is_init else self.draw_decay_speed_init - x = exponentialDecayRounded(self.drawn_points[-1].position[0], target.position[0], decay_speed, dt, .05) - y = exponentialDecayRounded(self.drawn_points[-1].position[1], target.position[1], decay_speed, dt, .05) + x = exponentialDecayRounded(self.drawn_points[-1].position.x, target.position.x, decay_speed, dt, .05) + y = exponentialDecayRounded(self.drawn_points[-1].position.y, target.position.y, decay_speed, dt, .05) # handle color gradient: # if self.drawn_points[-1].color != target.color: @@ -546,7 +565,7 @@ class AppendableLineAnimator(LineAnimator): # t = (tx+ty) / 2 # TODO: this should set color to intermediate color, but this is hardly used, so skip it for sake of speed - self.drawn_points[-1].position = (float(x), float(y)) + self.drawn_points[-1].position = RenderablePosition(float(x), float(y)) @@ -761,7 +780,7 @@ class NoiseLine(LineAnimator): if self.amplitude < 0.01: return target_line - positions = np.array([p.position for p in target_line.points]) + positions = np.array([p.position.to_tuple() for p in target_line.points]) new_positions = self.apply_perlin_noise_to_line_normal( positions, self.t * self.t_factor, @@ -772,7 +791,7 @@ class NoiseLine(LineAnimator): points = [] for point, pos in zip(target_line.points, new_positions): p = copy.deepcopy(point) - p.position = pos + p.position = RenderablePosition(*pos) points.append(p) @@ -1017,3 +1036,45 @@ class LineAnimationSequence(): def as_renderable_line(self, dt: DeltaT): return self.seq[self.idx].as_renderable_line(dt) + + +def layers_to_protobuf(layers: RenderableLayers): + pb_layers = renderable_pb2.RenderableLayers() + + new_layers = {} + + for n, lines in layers.items(): + # pb_lines = pb_layers.layers[n].value.add() + pb_lines = renderable_pb2.RenderableLines() + pb_lines.space = lines.space + + for line in lines.lines: + l = renderable_pb2.RenderableLine() + for p in line.points: + point = renderable_pb2.RenderablePoint() + point.position.x = p.position.x + point.position.y = p.position.y + point.color.red = p.color.red + point.color.green = p.color.green + point.color.blue = p.color.blue + point.color.alpha = p.color.alpha + l.points.append(point) + pb_lines.lines.append(l) + + + # new_layers[n] = pb_lines + pb_layers.layers[n].CopyFrom(pb_lines) + # pb_layers.layers = new_layers + return pb_layers + +def layers_to_message(layers: RenderableLayers): + t1 = time.perf_counter() + # buf = layers_to_protobuf(layers) + t2 = time.perf_counter() + # s = buf.SerializeToString() + s = bytes(layers) + t3 = time.perf_counter() + + print( t2-t1, t3-t2, len(s)) + + return s \ No newline at end of file diff --git a/trap/protobuf/__init__.py b/trap/protobuf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trap/protobuf/renderable.py b/trap/protobuf/renderable.py new file mode 100644 index 0000000..5c367c5 --- /dev/null +++ b/trap/protobuf/renderable.py @@ -0,0 +1,68 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: renderable.proto +# plugin: python-betterproto +from dataclasses import dataclass +from typing import Dict, List + +import betterproto + + +class CoordinateSpace(betterproto.Enum): + """Enum for coordinate spaces""" + + UNDEFINED = 0 + CAMERA = 1 + UNDISTORTED_CAMERA = 2 + WORLD = 3 + LASER = 4 + RAW_LASER = 8 + + +@dataclass +class RenderablePosition(betterproto.Message): + """Message for RenderablePosition (Tuple[float, float])""" + + x: float = betterproto.float_field(1) + y: float = betterproto.float_field(2) + + +@dataclass +class SrgbaColor(betterproto.Message): + """Message for SrgbaColor""" + + red: float = betterproto.float_field(1) + green: float = betterproto.float_field(2) + blue: float = betterproto.float_field(3) + alpha: float = betterproto.float_field(4) + + +@dataclass +class RenderablePoint(betterproto.Message): + """Message for RenderablePoint""" + + position: "RenderablePosition" = betterproto.message_field(1) + color: "SrgbaColor" = betterproto.message_field(2) + + +@dataclass +class RenderableLine(betterproto.Message): + """Message for RenderableLine""" + + points: List["RenderablePoint"] = betterproto.message_field(1) + + +@dataclass +class RenderableLines(betterproto.Message): + """Message for RenderableLines""" + + lines: List["RenderableLine"] = betterproto.message_field(1) + space: "CoordinateSpace" = betterproto.enum_field(2) + + +@dataclass +class RenderableLayers(betterproto.Message): + """Message to represent RenderableLayers (Dict[int, RenderableLines])""" + + layers: Dict[int, "RenderableLines"] = betterproto.map_field( + 1, betterproto.TYPE_INT32, betterproto.TYPE_MESSAGE + ) diff --git a/trap/renderable_pb2.py b/trap/renderable_pb2.py new file mode 100644 index 0000000..0590702 --- /dev/null +++ b/trap/renderable_pb2.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: renderable.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10renderable.proto\x12\nrenderable\"*\n\x12RenderablePosition\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"E\n\nSrgbaColor\x12\x0b\n\x03red\x18\x01 \x01(\x02\x12\r\n\x05green\x18\x02 \x01(\x02\x12\x0c\n\x04\x62lue\x18\x03 \x01(\x02\x12\r\n\x05\x61lpha\x18\x04 \x01(\x02\"j\n\x0fRenderablePoint\x12\x30\n\x08position\x18\x01 \x01(\x0b\x32\x1e.renderable.RenderablePosition\x12%\n\x05\x63olor\x18\x02 \x01(\x0b\x32\x16.renderable.SrgbaColor\"=\n\x0eRenderableLine\x12+\n\x06points\x18\x01 \x03(\x0b\x32\x1b.renderable.RenderablePoint\"h\n\x0fRenderableLines\x12)\n\x05lines\x18\x01 \x03(\x0b\x32\x1a.renderable.RenderableLine\x12*\n\x05space\x18\x02 \x01(\x0e\x32\x1b.renderable.CoordinateSpace\"\x98\x01\n\x10RenderableLayers\x12\x38\n\x06layers\x18\x01 \x03(\x0b\x32(.renderable.RenderableLayers.LayersEntry\x1aJ\n\x0bLayersEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.renderable.RenderableLines:\x02\x38\x01*Z\n\x0f\x43oordinateSpace\x12\r\n\tUNDEFINED\x10\x00\x12\n\n\x06\x43\x41MERA\x10\x01\x12\x16\n\x12UNDISTORTED_CAMERA\x10\x02\x12\t\n\x05WORLD\x10\x03\x12\t\n\x05LASER\x10\x04\x62\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'renderable_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _RENDERABLELAYERS_LAYERSENTRY._options = None + _RENDERABLELAYERS_LAYERSENTRY._serialized_options = b'8\001' + _COORDINATESPACE._serialized_start=579 + _COORDINATESPACE._serialized_end=669 + _RENDERABLEPOSITION._serialized_start=32 + _RENDERABLEPOSITION._serialized_end=74 + _SRGBACOLOR._serialized_start=76 + _SRGBACOLOR._serialized_end=145 + _RENDERABLEPOINT._serialized_start=147 + _RENDERABLEPOINT._serialized_end=253 + _RENDERABLELINE._serialized_start=255 + _RENDERABLELINE._serialized_end=316 + _RENDERABLELINES._serialized_start=318 + _RENDERABLELINES._serialized_end=422 + _RENDERABLELAYERS._serialized_start=425 + _RENDERABLELAYERS._serialized_end=577 + _RENDERABLELAYERS_LAYERSENTRY._serialized_start=503 + _RENDERABLELAYERS_LAYERSENTRY._serialized_end=577 +# @@protoc_insertion_point(module_scope) diff --git a/trap/stage.py b/trap/stage.py index 49f591f..1eb6085 100644 --- a/trap/stage.py +++ b/trap/stage.py @@ -5,6 +5,7 @@ from collections import defaultdict from dataclasses import dataclass from enum import Enum from functools import partial +import json import logging from math import inf from pathlib import Path @@ -18,7 +19,7 @@ import zmq from trap.anomaly import DiffSegment, calc_anomaly, calculate_loitering_scores from trap.base import CameraAction, DataclassJSONEncoder, Frame, HomographyAction, ProjectedTrack, Track from trap.counter import CounterSender -from trap.lines import AppendableLine, AppendableLineAnimator, Coordinate, CropLine, DashedLine, DeltaT, FadeOutJitterLine, FadeOutLine, FadedTailLine, LineAnimationStack, LineAnimator, NoiseLine, RenderableLayers, RenderableLine, RenderableLines, SegmentLine, SimplifyMethod, SrgbaColor, StaticLine, load_lines_from_svg +from trap.lines import AppendableLine, AppendableLineAnimator, Coordinate, CropLine, DashedLine, DeltaT, FadeOutJitterLine, FadeOutLine, FadedTailLine, LineAnimationStack, LineAnimator, NoiseLine, RenderableLayers, RenderableLine, RenderableLines, SegmentLine, SimplifyMethod, SrgbaColor, StaticLine, layers_to_message, load_lines_from_svg from trap.node import Node from trap.track_history import TrackHistory @@ -283,7 +284,7 @@ class DrawnScenario(Scenario): # when rendering tracks from others similar/close to the current one self.others_color = SrgbaColor(1,1,0,1) self.line_others = LineAnimationStack(StaticLine([], self.others_color)) - self.line_others.add(SegmentLine(self.line_others.tail, duration=3, anim_f=partial(SegmentLine.anim_grow, in_and_out=True, max_len=8))) + self.line_others.add(SegmentLine(self.line_others.tail, duration=3, anim_f=partial(SegmentLine.anim_grow, in_and_out=True, max_len=5))) # self.line_others.add(DashedLine(self.line_others.tail, t_factor=4, loop_offset=True)) # self.line_others.get(DashedLine).skip = True self.line_others.add(FadeOutLine(self.line_others.tail)) @@ -534,21 +535,43 @@ class Stage(Node): lines = RenderableLines([]) # TODO: sometimes very slow! + t1 = time.perf_counter() for scenario in self.active_scenarios: lines.append_lines(scenario.to_renderable_lines(dt)) + t2 = time.perf_counter() rl = lines.as_simplified(SimplifyMethod.RDP, .003) # or segmentise (see shapely) self.counter.set("stage.lines", len(lines.lines)) self.counter.set("stage.points_orig", lines.point_count()) self.counter.set("stage.points", rl.point_count()) + t3 = time.perf_counter() - layers: RenderableLayers = { + + layers = RenderableLayers({ 1: lines, 2: self.debug_lines, - } + }) + t4 = time.perf_counter() + + # msg = json.dumps(layers, cls=DataclassJSONEncoder).encode("utf8") + msg = layers_to_message(layers) - self.stage_sock.send_json(obj=layers, cls=DataclassJSONEncoder) + t5 = time.perf_counter() + self.stage_sock.send(msg) + + # self.stage_sock.send_json(obj=layers, cls=DataclassJSONEncoder) + + t6 = time.perf_counter() + + t = (t2-t1, t3-t2, t4-t3, t5-t4, t6-t5) + if sum(t) > .1: + print(t) + print(len(lines.lines)) + print(lines.point_count()) + print(len(msg)) + print(msg) + # exit() diff --git a/uv.lock b/uv.lock index 0c3d7a6..41bdb08 100644 --- a/uv.lock +++ b/uv.lock @@ -91,6 +91,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, ] +[[package]] +name = "alchemy-logging" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/2a/950fc0f382a65023e64301d9a3a24458b0f7d9be45df7ca7bd242bee4f8a/alchemy-logging-1.5.0.tar.gz", hash = "sha256:ef87de99898f1e62c7cae99e4d2ed4c02c32ccf4c21d6c7a08d93af2bc9945cc", size = 20433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/93/0c3073f2a18173d5486abf74dd28d9157e36e159092535e12379333c2f89/alchemy_logging-1.5.0-py3-none-any.whl", hash = "sha256:459ee641c00553175a38f47587ff654ca544985626938e097cb6f85325bd241e", size = 18765 }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -239,6 +248,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] +[[package]] +name = "betterproto" +version = "1.2.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpclib" }, + { name = "stringcase" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/2e/abfed7a721928e14aeb900182ff695be474c4ee5f07ef0874cc5ecd5b0b1/betterproto-1.2.5.tar.gz", hash = "sha256:74a3ab34646054f674d236d1229ba8182dc2eae86feb249b8590ef496ce9803d", size = 26098 } + +[package.optional-dependencies] +compiler = [ + { name = "black" }, + { name = "jinja2" }, + { name = "protobuf" }, +] + [[package]] name = "bidict" version = "0.23.1" @@ -248,6 +274,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764 }, ] +[[package]] +name = "black" +version = "25.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, + { name = "tomli" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/40/dbe31fc56b218a858c8fc6f5d8d3ba61c1fa7e989d43d4a4574b8b992840/black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7", size = 1715605 }, + { url = "https://files.pythonhosted.org/packages/92/b2/f46800621200eab6479b1f4c0e3ede5b4c06b768e79ee228bc80270bcc74/black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92", size = 1571829 }, + { url = "https://files.pythonhosted.org/packages/4e/64/5c7f66bd65af5c19b4ea86062bb585adc28d51d37babf70969e804dbd5c2/black-25.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713", size = 1631888 }, + { url = "https://files.pythonhosted.org/packages/3b/64/0b9e5bfcf67db25a6eef6d9be6726499a8a72ebab3888c2de135190853d3/black-25.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1", size = 1327056 }, + { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363 }, +] + [[package]] name = "bleach" version = "6.2.0" @@ -662,20 +711,59 @@ wheels = [ [[package]] name = "grpcio" -version = "1.71.0" +version = "1.76.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/95/aa11fc09a85d91fbc7dd405dcb2a1e0256989d67bf89fa65ae24b3ba105a/grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c", size = 12549828 } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/c5/ef610b3f988cc0cc67b765f72b8e2db06a1db14e65acb5ae7810a6b7042e/grpcio-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:c200cb6f2393468142eb50ab19613229dcc7829b5ccee8b658a36005f6669fdd", size = 5210643 }, - { url = "https://files.pythonhosted.org/packages/bf/de/c84293c961622df302c0d5d07ec6e2d4cd3874ea42f602be2df09c4ad44f/grpcio-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b2266862c5ad664a380fbbcdbdb8289d71464c42a8c29053820ee78ba0119e5d", size = 11308962 }, - { url = "https://files.pythonhosted.org/packages/7c/38/04c9e0dc8c904570c80faa1f1349b190b63e45d6b2782ec8567b050efa9d/grpcio-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0ab8b2864396663a5b0b0d6d79495657ae85fa37dcb6498a2669d067c65c11ea", size = 5699236 }, - { url = "https://files.pythonhosted.org/packages/95/96/e7be331d1298fa605ea7c9ceafc931490edd3d5b33c4f695f1a0667f3491/grpcio-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c30f393f9d5ff00a71bb56de4aa75b8fe91b161aeb61d39528db6b768d7eac69", size = 6339767 }, - { url = "https://files.pythonhosted.org/packages/5d/b7/7e7b7bb6bb18baf156fd4f2f5b254150dcdd6cbf0def1ee427a2fb2bfc4d/grpcio-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f250ff44843d9a0615e350c77f890082102a0318d66a99540f54769c8766ab73", size = 5943028 }, - { url = "https://files.pythonhosted.org/packages/13/aa/5fb756175995aeb47238d706530772d9a7ac8e73bcca1b47dc145d02c95f/grpcio-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6d8de076528f7c43a2f576bc311799f89d795aa6c9b637377cc2b1616473804", size = 6031841 }, - { url = "https://files.pythonhosted.org/packages/54/93/172783e01eed61f7f180617b7fa4470f504e383e32af2587f664576a7101/grpcio-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b91879d6da1605811ebc60d21ab6a7e4bae6c35f6b63a061d61eb818c8168f6", size = 6651039 }, - { url = "https://files.pythonhosted.org/packages/6f/99/62654b220a27ed46d3313252214f4bc66261143dc9b58004085cd0646753/grpcio-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f71574afdf944e6652203cd1badcda195b2a27d9c83e6d88dc1ce3cfb73b31a5", size = 6198465 }, - { url = "https://files.pythonhosted.org/packages/68/35/96116de833b330abe4412cc94edc68f99ed2fa3e39d8713ff307b3799e81/grpcio-1.71.0-cp310-cp310-win32.whl", hash = "sha256:8997d6785e93308f277884ee6899ba63baafa0dfb4729748200fcc537858a509", size = 3620382 }, - { url = "https://files.pythonhosted.org/packages/b7/09/f32ef637e386f3f2c02effac49699229fa560ce9007682d24e9e212d2eb4/grpcio-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d6ac9481d9d0d129224f6d5934d5832c4b1cddb96b59e7eba8416868909786a", size = 4280302 }, + { url = "https://files.pythonhosted.org/packages/88/17/ff4795dc9a34b6aee6ec379f1b66438a3789cd1315aac0cbab60d92f74b3/grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", size = 5840037 }, + { url = "https://files.pythonhosted.org/packages/4e/ff/35f9b96e3fa2f12e1dcd58a4513a2e2294a001d64dec81677361b7040c9a/grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", size = 11836482 }, + { url = "https://files.pythonhosted.org/packages/3e/1c/8374990f9545e99462caacea5413ed783014b3b66ace49e35c533f07507b/grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", size = 6407178 }, + { url = "https://files.pythonhosted.org/packages/1e/77/36fd7d7c75a6c12542c90a6d647a27935a1ecaad03e0ffdb7c42db6b04d2/grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", size = 7075684 }, + { url = "https://files.pythonhosted.org/packages/38/f7/e3cdb252492278e004722306c5a8935eae91e64ea11f0af3437a7de2e2b7/grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", size = 6611133 }, + { url = "https://files.pythonhosted.org/packages/7e/20/340db7af162ccd20a0893b5f3c4a5d676af7b71105517e62279b5b61d95a/grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", size = 7195507 }, + { url = "https://files.pythonhosted.org/packages/10/f0/b2160addc1487bd8fa4810857a27132fb4ce35c1b330c2f3ac45d697b106/grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", size = 8160651 }, + { url = "https://files.pythonhosted.org/packages/2c/2c/ac6f98aa113c6ef111b3f347854e99ebb7fb9d8f7bb3af1491d438f62af4/grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", size = 7620568 }, + { url = "https://files.pythonhosted.org/packages/90/84/7852f7e087285e3ac17a2703bc4129fafee52d77c6c82af97d905566857e/grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", size = 3998879 }, + { url = "https://files.pythonhosted.org/packages/10/30/d3d2adcbb6dd3ff59d6ac3df6ef830e02b437fb5c90990429fd180e52f30/grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", size = 4706892 }, +] + +[[package]] +name = "grpcio-tools" +version = "1.76.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpcio" }, + { name = "protobuf" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/77/17d60d636ccd86a0db0eccc24d02967bbc3eea86b9db7324b04507ebaa40/grpcio_tools-1.76.0.tar.gz", hash = "sha256:ce80169b5e6adf3e8302f3ebb6cb0c3a9f08089133abca4b76ad67f751f5ad88", size = 5390807 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/4b/6fceb806f6d5055793f5db0d7a1e3449ea16482c2aec3ad93b05678c325a/grpcio_tools-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:9b99086080ca394f1da9894ee20dedf7292dd614e985dcba58209a86a42de602", size = 2545596 }, + { url = "https://files.pythonhosted.org/packages/3b/11/57af2f3f32016e6e2aae063a533aae2c0e6c577bc834bef97277a7fa9733/grpcio_tools-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8d95b5c2394bbbe911cbfc88d15e24c9e174958cb44dad6aa8c46fe367f6cc2a", size = 5843462 }, + { url = "https://files.pythonhosted.org/packages/3f/8b/470bedaf7fb75fb19500b4c160856659746dcf53e3d9241fcc17e3af7155/grpcio_tools-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d54e9ce2ffc5d01341f0c8898c1471d887ae93d77451884797776e0a505bd503", size = 2591938 }, + { url = "https://files.pythonhosted.org/packages/77/3e/530e848e00d6fe2db152984b2c9432bb8497a3699719fd7898d05cb7d95e/grpcio_tools-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c83f39f64c2531336bd8d5c846a2159c9ea6635508b0f8ed3ad0d433e25b53c9", size = 2905296 }, + { url = "https://files.pythonhosted.org/packages/75/b5/632229d17364eb7db5d3d793131172b2380323c4e6500f528743e477267c/grpcio_tools-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be480142fae0d986d127d6cb5cbc0357e4124ba22e96bb8b9ece32c48bc2c8ea", size = 2656266 }, + { url = "https://files.pythonhosted.org/packages/ff/71/5756aa9a14d16738b04677b89af8612112d69fb098ffdbc5666020933f23/grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7fefd41fc4ca11fab36f42bdf0f3812252988f8798fca8bec8eae049418deacd", size = 3105798 }, + { url = "https://files.pythonhosted.org/packages/ab/de/9058021da11be399abe6c5d2a9a2abad1b00d367111018637195d107539b/grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63551f371082173e259e7f6ec24b5f1fe7d66040fadd975c966647bca605a2d3", size = 3654923 }, + { url = "https://files.pythonhosted.org/packages/8e/93/29f04cc18f1023b2a4342374a45b1cd87a0e1458fc44aea74baad5431dcd/grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75a2c34584c99ff47e5bb267866e7dec68d30cd3b2158e1ee495bfd6db5ad4f0", size = 3322558 }, + { url = "https://files.pythonhosted.org/packages/d9/ab/8936708d30b9a2484f6b093dfc57843c1d0380de0eba78a8ad8693535f26/grpcio_tools-1.76.0-cp310-cp310-win32.whl", hash = "sha256:908758789b0a612102c88e8055b7191eb2c4290d5d6fc50fb9cac737f8011ef1", size = 993621 }, + { url = "https://files.pythonhosted.org/packages/3d/d2/c5211feb81a532eca2c4dddd00d4971b91c10837cd083781f6ab3a6fdb5b/grpcio_tools-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:ec6e49e7c4b2a222eb26d1e1726a07a572b6e629b2cf37e6bb784c9687904a52", size = 1158401 }, +] + +[[package]] +name = "grpclib" +version = "0.4.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h2" }, + { name = "multidict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/75/0f0d3524b38b35e5cd07334b754aa9bd0570140ad982131b04ebfa3b0374/grpclib-0.4.8.tar.gz", hash = "sha256:d8823763780ef94fed8b2c562f7485cf0bbee15fc7d065a640673667f7719c9a", size = 62793 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/8b/ad381ec1b8195fa4a9a693cb8087e031b99530c0d6b8ad036dcb99e144c4/grpclib-0.4.8-py3-none-any.whl", hash = "sha256:a5047733a7acc1c1cee6abf3c841c7c6fab67d2844a45a853b113fa2e6cd2654", size = 76311 }, ] [[package]] @@ -687,6 +775,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, ] +[[package]] +name = "h2" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack" }, + { name = "hyperframe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779 }, +] + +[[package]] +name = "hpack" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357 }, +] + [[package]] name = "httpcore" version = "1.0.7" @@ -730,6 +840,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007 }, +] + [[package]] name = "idna" version = "3.10" @@ -1280,6 +1399,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/fd/b247aec6add5601956d440488b7f23151d8343747e82c038af37b28d6098/multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", size = 10266 }, ] +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, +] + [[package]] name = "narwhals" version = "2.9.0" @@ -1599,6 +1727,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + [[package]] name = "pexpect" version = "4.9.0" @@ -1707,16 +1844,17 @@ wheels = [ [[package]] name = "protobuf" -version = "6.30.1" +version = "6.33.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/55/de/8216061897a67b2ffe302fd51aaa76bbf613001f01cd96e2416a4955dd2b/protobuf-6.30.1.tar.gz", hash = "sha256:535fb4e44d0236893d5cf1263a0f706f1160b689a7ab962e9da8a9ce4050b780", size = 429304 } +sdist = { url = "https://files.pythonhosted.org/packages/19/ff/64a6c8f420818bb873713988ca5492cba3a7946be57e027ac63495157d97/protobuf-6.33.0.tar.gz", hash = "sha256:140303d5c8d2037730c548f8c7b93b20bb1dc301be280c378b82b8894589c954", size = 443463 } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/f6/28460c49a8a93229e2264cd35fd147153fb524cbd944789db6b6f3cc9b13/protobuf-6.30.1-cp310-abi3-win32.whl", hash = "sha256:ba0706f948d0195f5cac504da156d88174e03218d9364ab40d903788c1903d7e", size = 419150 }, - { url = "https://files.pythonhosted.org/packages/96/82/7045f5b3f3e338a8ab5852d22ce9c31e0a40d8b0f150a3735dc494be769a/protobuf-6.30.1-cp310-abi3-win_amd64.whl", hash = "sha256:ed484f9ddd47f0f1bf0648806cccdb4fe2fb6b19820f9b79a5adf5dcfd1b8c5f", size = 431007 }, - { url = "https://files.pythonhosted.org/packages/b0/b6/732d04d0cdf457d05b7cba83ae73735d91ceced2439735b4500e311c44a5/protobuf-6.30.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aa4f7dfaed0d840b03d08d14bfdb41348feaee06a828a8c455698234135b4075", size = 417579 }, - { url = "https://files.pythonhosted.org/packages/fc/22/29dd085f6e828ab0424e73f1bae9dbb9e8bb4087cba5a9e6f21dc614694e/protobuf-6.30.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:47cd320b7db63e8c9ac35f5596ea1c1e61491d8a8eb6d8b45edc44760b53a4f6", size = 317319 }, - { url = "https://files.pythonhosted.org/packages/26/10/8863ba4baa4660e3f50ad9ae974c47fb63fa6d4089b15f7db82164b1c879/protobuf-6.30.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3083660225fa94748ac2e407f09a899e6a28bf9c0e70c75def8d15706bf85fc", size = 316213 }, - { url = "https://files.pythonhosted.org/packages/a1/d6/683a3d470398e45b4ad9b6c95b7cbabc32f9a8daf454754f0e3df1edffa6/protobuf-6.30.1-py3-none-any.whl", hash = "sha256:3c25e51e1359f1f5fa3b298faa6016e650d148f214db2e47671131b9063c53be", size = 167064 }, + { url = "https://files.pythonhosted.org/packages/7e/ee/52b3fa8feb6db4a833dfea4943e175ce645144532e8a90f72571ad85df4e/protobuf-6.33.0-cp310-abi3-win32.whl", hash = "sha256:d6101ded078042a8f17959eccd9236fb7a9ca20d3b0098bbcb91533a5680d035", size = 425593 }, + { url = "https://files.pythonhosted.org/packages/7b/c6/7a465f1825872c55e0341ff4a80198743f73b69ce5d43ab18043699d1d81/protobuf-6.33.0-cp310-abi3-win_amd64.whl", hash = "sha256:9a031d10f703f03768f2743a1c403af050b6ae1f3480e9c140f39c45f81b13ee", size = 436882 }, + { url = "https://files.pythonhosted.org/packages/e1/a9/b6eee662a6951b9c3640e8e452ab3e09f117d99fc10baa32d1581a0d4099/protobuf-6.33.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:905b07a65f1a4b72412314082c7dbfae91a9e8b68a0cc1577515f8df58ecf455", size = 427521 }, + { url = "https://files.pythonhosted.org/packages/10/35/16d31e0f92c6d2f0e77c2a3ba93185130ea13053dd16200a57434c882f2b/protobuf-6.33.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e0697ece353e6239b90ee43a9231318302ad8353c70e6e45499fa52396debf90", size = 324445 }, + { url = "https://files.pythonhosted.org/packages/e6/eb/2a981a13e35cda8b75b5585aaffae2eb904f8f351bdd3870769692acbd8a/protobuf-6.33.0-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:e0a1715e4f27355afd9570f3ea369735afc853a6c3951a6afe1f80d8569ad298", size = 339159 }, + { url = "https://files.pythonhosted.org/packages/21/51/0b1cbad62074439b867b4e04cc09b93f6699d78fd191bed2bbb44562e077/protobuf-6.33.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:35be49fd3f4fefa4e6e2aacc35e8b837d6703c37a2168a55ac21e9b1bc7559ef", size = 323172 }, + { url = "https://files.pythonhosted.org/packages/07/d1/0a28c21707807c6aacd5dc9c3704b2aa1effbf37adebd8caeaf68b17a636/protobuf-6.33.0-py3-none-any.whl", hash = "sha256:25c9e1963c6734448ea2d308cfa610e692b801304ba0908d7bfa564ac5132995", size = 170477 }, ] [[package]] @@ -1770,6 +1908,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335 }, ] +[[package]] +name = "py-to-proto" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alchemy-logging" }, + { name = "protobuf" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/66/521c7f0e630dd0cd32cd25e2e25d2360cfcf179dbe5de68d3d6142b83336/py_to_proto-0.6.0-py310-none-any.whl", hash = "sha256:48a2a109b81574c63a757e79c09b80a4d18a828928db8232646ff2e4c13e4263", size = 33383 }, + { url = "https://files.pythonhosted.org/packages/85/d4/077c7f02971e243630dc44fe75544d7694ec49fda7a35bf56935af045d1c/py_to_proto-0.6.0-py38-none-any.whl", hash = "sha256:01c5f2f64b31f0bd9dcb073309264c1f6fa3d8fb410edf329ee537d6d69184b3", size = 33397 }, + { url = "https://files.pythonhosted.org/packages/e8/13/58fcb27c1981ad1ab2b2c7921f611c597d741e73e6e1a1340aa19baf96e5/py_to_proto-0.6.0-py39-none-any.whl", hash = "sha256:1d8a4800b4d829819d598f79feb78acdd274f5f50446e3e10e9482edd383104d", size = 33397 }, +] + [[package]] name = "pycparser" version = "2.22" @@ -1964,6 +2116,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/2d/1c95ebe84df60d630f8e855d1df2c66368805444ac167e9b50f29eabe917/python_statemachine-2.5.0-py3-none-any.whl", hash = "sha256:0ed53846802c17037fcb2a92323f4bc0c833290fa9d17a3587c50886c1541e62", size = 50415 }, ] +[[package]] +name = "pytokens" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/c2/dbadcdddb412a267585459142bfd7cc241e6276db69339353ae6e241ab2b/pytokens-0.2.0.tar.gz", hash = "sha256:532d6421364e5869ea57a9523bf385f02586d4662acbcc0342afd69511b4dd43", size = 15368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/5a/c269ea6b348b6f2c32686635df89f32dbe05df1088dd4579302a6f8f99af/pytokens-0.2.0-py3-none-any.whl", hash = "sha256:74d4b318c67f4295c13782ddd9abcb7e297ec5630ad060eb90abf7ebbefe59f8", size = 12038 }, +] + [[package]] name = "pytz" version = "2025.2" @@ -2359,6 +2520,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, ] +[[package]] +name = "stringcase" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/1f/1241aa3d66e8dc1612427b17885f5fcd9c9ee3079fc0d28e9a3aeeb36fa3/stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008", size = 2958 } + [[package]] name = "superfsmon" version = "1.2.3" @@ -2706,12 +2873,14 @@ version = "0.1.0" source = { editable = "." } dependencies = [ { name = "baumer-neoapi" }, + { name = "betterproto", extra = ["compiler"] }, { name = "bytetracker" }, { name = "deep-sort-realtime" }, { name = "facenet-pytorch" }, { name = "ffmpeg-python" }, { name = "foucault" }, { name = "gdown" }, + { name = "grpcio-tools" }, { name = "ipywidgets" }, { name = "jsonlines" }, { name = "noise" }, @@ -2719,6 +2888,7 @@ dependencies = [ { name = "open3d" }, { name = "opencv-python" }, { name = "pandas-helper-calc" }, + { name = "py-to-proto" }, { name = "pyglet" }, { name = "pyglet-cornerpin" }, { name = "python-statemachine" }, @@ -2745,12 +2915,14 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "baumer-neoapi", path = "../../Downloads/Baumer_neoAPI_1.5.0_lin_x86_64_python/wheel/baumer_neoapi-1.5.0-cp34.cp35.cp36.cp37.cp38.cp39.cp310.cp311.cp312-none-linux_x86_64.whl" }, + { name = "betterproto", extras = ["compiler"], specifier = ">=1.2.5" }, { name = "bytetracker", git = "https://github.com/rubenvandeven/bytetrack-pip" }, { name = "deep-sort-realtime", specifier = ">=1.3.2,<2" }, { name = "facenet-pytorch", specifier = ">=2.5.3" }, { name = "ffmpeg-python", specifier = ">=0.2.0,<0.3" }, { name = "foucault", git = "https://git.rubenvandeven.com/r/conductofconduct" }, { name = "gdown", specifier = ">=4.7.1,<5" }, + { name = "grpcio-tools", specifier = ">=1.76.0" }, { name = "ipywidgets", specifier = ">=8.1.5,<9" }, { name = "jsonlines", specifier = ">=4.0.0,<5" }, { name = "noise", specifier = ">=1.2.2" }, @@ -2758,6 +2930,7 @@ requires-dist = [ { name = "open3d", specifier = ">=0.19.0" }, { name = "opencv-python", path = "opencv_python-4.10.0.84-cp310-cp310-linux_x86_64.whl" }, { name = "pandas-helper-calc", git = "https://github.com/scls19fr/pandas-helper-calc" }, + { name = "py-to-proto", specifier = ">=0.6.0" }, { name = "pyglet", specifier = ">=2.0.15,<3" }, { name = "pyglet-cornerpin", specifier = ">=0.3.0,<0.4" }, { name = "python-statemachine", specifier = ">=2.5.0" }, @@ -2806,11 +2979,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.13.0" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, ] [[package]]