betterproto2-compiler 0.4.0__py3-none-any.whl → 0.5.1__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.
@@ -1,5 +1,5 @@
1
1
  # Generated by the protocol buffer compiler. DO NOT EDIT!
2
- # sources: google/protobuf/compiler/plugin.proto
2
+ # sources: plugin.proto
3
3
  # plugin: python-betterproto2
4
4
  # This file has been @generated
5
5
 
@@ -11,18 +11,13 @@ __all__ = (
11
11
  "Version",
12
12
  )
13
13
 
14
-
15
14
  from dataclasses import dataclass
16
- from typing import (
17
- List,
18
- Optional,
19
- )
20
15
 
21
16
  import betterproto2
22
17
 
23
18
  from ....message_pool import default_message_pool
24
19
 
25
- betterproto2.check_compiler_version("0.4.0")
20
+ betterproto2.check_compiler_version("0.5.0")
26
21
 
27
22
 
28
23
  class CodeGeneratorResponseFeature(betterproto2.Enum):
@@ -43,7 +38,7 @@ class CodeGeneratorRequest(betterproto2.Message):
43
38
  An encoded CodeGeneratorRequest is written to the plugin's stdin.
44
39
  """
45
40
 
46
- file_to_generate: "List[str]" = betterproto2.field(1, betterproto2.TYPE_STRING, repeated=True)
41
+ file_to_generate: "list[str]" = betterproto2.field(1, betterproto2.TYPE_STRING, repeated=True)
47
42
  """
48
43
  The .proto files that were explicitly listed on the command-line. The
49
44
  code generator should generate code only for these files. Each file's
@@ -55,7 +50,7 @@ class CodeGeneratorRequest(betterproto2.Message):
55
50
  The generator parameter passed on the command-line.
56
51
  """
57
52
 
58
- proto_file: "List[__protobuf__.FileDescriptorProto]" = betterproto2.field(
53
+ proto_file: "list[__protobuf__.FileDescriptorProto]" = betterproto2.field(
59
54
  15, betterproto2.TYPE_MESSAGE, repeated=True
60
55
  )
61
56
  """
@@ -80,7 +75,7 @@ class CodeGeneratorRequest(betterproto2.Message):
80
75
  fully qualified.
81
76
  """
82
77
 
83
- source_file_descriptors: "List[__protobuf__.FileDescriptorProto]" = betterproto2.field(
78
+ source_file_descriptors: "list[__protobuf__.FileDescriptorProto]" = betterproto2.field(
84
79
  17, betterproto2.TYPE_MESSAGE, repeated=True
85
80
  )
86
81
  """
@@ -89,7 +84,7 @@ class CodeGeneratorRequest(betterproto2.Message):
89
84
  files_to_generate.
90
85
  """
91
86
 
92
- compiler_version: "Optional[Version]" = betterproto2.field(3, betterproto2.TYPE_MESSAGE, optional=True)
87
+ compiler_version: "Version | None" = betterproto2.field(3, betterproto2.TYPE_MESSAGE, optional=True)
93
88
  """
94
89
  The version number of protocol compiler.
95
90
  """
@@ -122,7 +117,23 @@ class CodeGeneratorResponse(betterproto2.Message):
122
117
  This is a bitwise "or" of values from the Feature enum.
123
118
  """
124
119
 
125
- file: "List[CodeGeneratorResponseFile]" = betterproto2.field(15, betterproto2.TYPE_MESSAGE, repeated=True)
120
+ minimum_edition: "int" = betterproto2.field(3, betterproto2.TYPE_INT32)
121
+ """
122
+ The minimum edition this plugin supports. This will be treated as an
123
+ Edition enum, but we want to allow unknown values. It should be specified
124
+ according the edition enum value, *not* the edition number. Only takes
125
+ effect for plugins that have FEATURE_SUPPORTS_EDITIONS set.
126
+ """
127
+
128
+ maximum_edition: "int" = betterproto2.field(4, betterproto2.TYPE_INT32)
129
+ """
130
+ The maximum edition this plugin supports. This will be treated as an
131
+ Edition enum, but we want to allow unknown values. It should be specified
132
+ according the edition enum value, *not* the edition number. Only takes
133
+ effect for plugins that have FEATURE_SUPPORTS_EDITIONS set.
134
+ """
135
+
136
+ file: "list[CodeGeneratorResponseFile]" = betterproto2.field(15, betterproto2.TYPE_MESSAGE, repeated=True)
126
137
 
127
138
 
128
139
  default_message_pool.register_message("google.protobuf.compiler", "CodeGeneratorResponse", CodeGeneratorResponse)
@@ -139,7 +150,7 @@ class CodeGeneratorResponseFile(betterproto2.Message):
139
150
  The file name, relative to the output directory. The name must not
140
151
  contain "." or ".." components and must be relative, not be absolute (so,
141
152
  the file cannot lie outside the output directory). "/" must be used as
142
- the path separator, not "\".
153
+ the path separator, not "\\".
143
154
 
144
155
  If the name is omitted, the content will be appended to the previous
145
156
  file. This allows the generator to break large files into small chunks,
@@ -195,7 +206,7 @@ class CodeGeneratorResponseFile(betterproto2.Message):
195
206
  The file contents.
196
207
  """
197
208
 
198
- generated_code_info: "Optional[__protobuf__.GeneratedCodeInfo]" = betterproto2.field(
209
+ generated_code_info: "__protobuf__.GeneratedCodeInfo | None" = betterproto2.field(
199
210
  16, betterproto2.TYPE_MESSAGE, optional=True
200
211
  )
201
212
  """
@@ -15,8 +15,7 @@ def main() -> None:
15
15
  data = sys.stdin.buffer.read()
16
16
 
17
17
  # Parse request
18
- request = CodeGeneratorRequest()
19
- request.parse(data)
18
+ request = CodeGeneratorRequest.parse(data)
20
19
 
21
20
  dump_file = os.getenv("BETTERPROTO_DUMP")
22
21
  if dump_file:
@@ -26,14 +26,12 @@ such as a pythonized name, that will be calculated from proto_obj.
26
26
 
27
27
  import builtins
28
28
  import inspect
29
- import re
30
29
  from collections.abc import Iterator
31
30
  from dataclasses import (
32
31
  dataclass,
33
32
  field,
34
33
  )
35
34
 
36
- import betterproto2
37
35
  from betterproto2 import unwrap
38
36
 
39
37
  from betterproto2_compiler.compile.importing import get_type_reference, parse_source_type_name
@@ -43,7 +41,7 @@ from betterproto2_compiler.compile.naming import (
43
41
  pythonize_field_name,
44
42
  pythonize_method_name,
45
43
  )
46
- from betterproto2_compiler.known_types import KNOWN_METHODS
44
+ from betterproto2_compiler.known_types import KNOWN_METHODS, WRAPPED_TYPES
47
45
  from betterproto2_compiler.lib.google.protobuf import (
48
46
  DescriptorProto,
49
47
  EnumDescriptorProto,
@@ -318,8 +316,14 @@ class FieldCompiler(ProtoContentBase):
318
316
  @property
319
317
  def betterproto_field_args(self) -> list[str]:
320
318
  args = []
321
- if self.field_wraps:
322
- args.append(f"wraps={self.field_wraps}")
319
+
320
+ if self.field_type == FieldDescriptorProtoType.TYPE_MESSAGE and self.is_wrapped:
321
+ unwrap_type = self.unwrapped_py_type
322
+
323
+ # Without the lambda function, the type is evaluated right away, which fails since the corresponding
324
+ # import is placed at the end of the file to avoid circular imports.
325
+ args.append(f"unwrap=lambda: {unwrap_type}")
326
+
323
327
  if self.optional:
324
328
  args.append("optional=True")
325
329
  elif self.repeated:
@@ -338,16 +342,6 @@ class FieldCompiler(ProtoContentBase):
338
342
  self.py_type == self.py_name and self.py_name in dir(builtins)
339
343
  )
340
344
 
341
- @property
342
- def field_wraps(self) -> str | None:
343
- """Returns betterproto wrapped field type or None."""
344
- match_wrapper = re.match(r"\.google\.protobuf\.(.+)Value$", self.proto_obj.type_name)
345
- if match_wrapper:
346
- wrapped_type = "TYPE_" + match_wrapper.group(1).upper()
347
- if hasattr(betterproto2, wrapped_type):
348
- return f"betterproto2.{wrapped_type}"
349
- return None
350
-
351
345
  @property
352
346
  def repeated(self) -> bool:
353
347
  return self.proto_obj.label == FieldDescriptorProtoLabel.LABEL_REPEATED
@@ -378,7 +372,13 @@ class FieldCompiler(ProtoContentBase):
378
372
  return self.proto_obj.name
379
373
 
380
374
  @property
381
- def py_type(self) -> str:
375
+ def is_wrapped(self) -> bool:
376
+ assert self.field_type == FieldDescriptorProtoType.TYPE_MESSAGE
377
+ type_package, type_name = parse_source_type_name(self.proto_obj.type_name, self.output_file.parent_request)
378
+
379
+ return (type_package, type_name) in WRAPPED_TYPES
380
+
381
+ def _py_type(self, wrap: bool) -> str:
382
382
  """String representation of Python type."""
383
383
  if self.proto_obj.type in PROTO_FLOAT_TYPES:
384
384
  return "float"
@@ -397,14 +397,24 @@ class FieldCompiler(ProtoContentBase):
397
397
  imports=self.output_file.imports_end,
398
398
  source_type=self.proto_obj.type_name,
399
399
  request=self.output_file.parent_request,
400
+ wrap=wrap,
400
401
  settings=self.output_file.settings,
401
402
  )
402
403
  else:
403
404
  raise NotImplementedError(f"Unknown type {self.proto_obj.type}")
404
405
 
406
+ @property
407
+ def py_type(self) -> str:
408
+ return self._py_type(wrap=True)
409
+
410
+ @property
411
+ def unwrapped_py_type(self) -> str:
412
+ return self._py_type(wrap=False)
413
+
405
414
  @property
406
415
  def annotation(self) -> str:
407
416
  py_type = self.py_type
417
+
408
418
  if self.use_builtins:
409
419
  py_type = f"builtins.{py_type}"
410
420
  if self.repeated:
@@ -432,6 +442,8 @@ class OneOfFieldCompiler(FieldCompiler):
432
442
  class MapEntryCompiler(FieldCompiler):
433
443
  py_k_type: str = ""
434
444
  py_v_type: str = ""
445
+ unwrap_v: str | None = None
446
+
435
447
  proto_k_type: str = ""
436
448
  proto_v_type: str = ""
437
449
 
@@ -441,18 +453,30 @@ class MapEntryCompiler(FieldCompiler):
441
453
  for nested in self.message.proto_obj.nested_type:
442
454
  if nested.name.replace("_", "").lower() == map_entry and unwrap(nested.options).map_entry:
443
455
  # Get Python types
456
+ assert nested.field[0].name == "key"
444
457
  self.py_k_type = FieldCompiler(
445
458
  source_file=self.source_file,
446
459
  proto_obj=nested.field[0], # key
447
460
  path=[],
448
461
  message=self.message,
449
462
  ).py_type
450
- self.py_v_type = FieldCompiler(
463
+
464
+ assert nested.field[1].name == "value"
465
+ value_field_compiler = FieldCompiler(
451
466
  source_file=self.source_file,
452
467
  proto_obj=nested.field[1], # value
453
468
  path=[],
454
469
  message=self.message,
455
- ).py_type
470
+ )
471
+
472
+ self.py_v_type = value_field_compiler.py_type
473
+ if (
474
+ value_field_compiler.field_type == FieldDescriptorProtoType.TYPE_MESSAGE
475
+ and value_field_compiler.is_wrapped
476
+ ):
477
+ self.unwrap_v = value_field_compiler.unwrapped_py_type
478
+ else:
479
+ self.unwrap_v = None
456
480
 
457
481
  # Get proto types
458
482
  self.proto_k_type = unwrap(FieldDescriptorProtoType(nested.field[0].type).name)
@@ -463,11 +487,19 @@ class MapEntryCompiler(FieldCompiler):
463
487
 
464
488
  def get_field_string(self) -> str:
465
489
  """Construct string representation of this field as a field."""
490
+ proto_type_1 = f"betterproto2.{self.proto_k_type}"
491
+ proto_type_2 = f"betterproto2.{self.proto_v_type}"
492
+
493
+ unwrap_2 = ""
494
+ if self.unwrap_v:
495
+ unwrap_2 = f", unwrap_2=lambda: {self.unwrap_v}"
496
+
466
497
  betterproto_field_type = (
467
- f"betterproto2.field({self.proto_obj.number}, "
498
+ "betterproto2.field("
499
+ f"{self.proto_obj.number}, "
468
500
  "betterproto2.TYPE_MAP, "
469
- f"map_types=(betterproto2.{self.proto_k_type}, "
470
- f"betterproto2.{self.proto_v_type}))"
501
+ f"map_meta=betterproto2.map_meta({proto_type_1}, {proto_type_2}{unwrap_2})"
502
+ ")"
471
503
  )
472
504
  if self.py_name in dir(builtins):
473
505
  self.message.builtins_types.add(self.py_name)
@@ -581,7 +613,7 @@ class ServiceMethodCompiler(ProtoContentBase):
581
613
  imports=self.parent.output_file.imports_end,
582
614
  source_type=self.proto_obj.input_type,
583
615
  request=self.parent.output_file.parent_request,
584
- unwrap=False,
616
+ wrap=False,
585
617
  settings=self.parent.output_file.settings,
586
618
  )
587
619
 
@@ -608,7 +640,7 @@ class ServiceMethodCompiler(ProtoContentBase):
608
640
  imports=self.parent.output_file.imports_end,
609
641
  source_type=self.proto_obj.output_type,
610
642
  request=self.parent.output_file.parent_request,
611
- unwrap=False,
643
+ wrap=False,
612
644
  settings=self.parent.output_file.settings,
613
645
  )
614
646
 
@@ -14,7 +14,7 @@ from betterproto2_compiler.lib.google.protobuf.compiler import (
14
14
  CodeGeneratorResponseFeature,
15
15
  CodeGeneratorResponseFile,
16
16
  )
17
- from betterproto2_compiler.settings import ClientGeneration, Settings
17
+ from betterproto2_compiler.settings import ClientGeneration, ServerGeneration, Settings
18
18
 
19
19
  from .compiler import outputfile_compiler
20
20
  from .models import (
@@ -62,22 +62,27 @@ def traverse(
62
62
  def get_settings(plugin_options: list[str]) -> Settings:
63
63
  # Synchronous clients are suitable for most users
64
64
  client_generation = ClientGeneration.SYNC
65
+ server_generation = ServerGeneration.NONE
65
66
 
66
67
  for opt in plugin_options:
67
68
  if opt.startswith("client_generation="):
68
69
  name = opt.split("=")[1]
69
-
70
- # print(ClientGeneration.__members__, file=sys.stderr)
71
- # print([member.value for member in ClientGeneration])
72
-
73
70
  try:
74
71
  client_generation = ClientGeneration(name)
75
72
  except ValueError:
76
73
  raise ValueError(f"Invalid client_generation option: {name}")
77
74
 
75
+ if opt.startswith("server_generation="):
76
+ name = opt.split("=")[1]
77
+ try:
78
+ server_generation = ServerGeneration(name)
79
+ except ValueError:
80
+ raise ValueError(f"Invalid server_generation option: {name}")
81
+
78
82
  return Settings(
79
83
  pydantic_dataclasses="pydantic_dataclasses" in plugin_options,
80
84
  client_generation=client_generation,
85
+ server_generation=server_generation,
81
86
  )
82
87
 
83
88
 
@@ -20,17 +20,17 @@ class ClientGeneration(StrEnum):
20
20
  SYNC_ASYNC = "sync_async"
21
21
  """Both synchronous and asynchronous clients are generated.
22
22
 
23
- The asynchronous client is generated with the Async suffix."""
23
+ Asynchronous clients are generated with the Async suffix."""
24
24
 
25
25
  ASYNC_SYNC = "async_sync"
26
26
  """Both synchronous and asynchronous clients are generated.
27
27
 
28
- The synchronous client is generated with the Sync suffix."""
28
+ Synchronous clients are generated with the Sync suffix."""
29
29
 
30
30
  SYNC_ASYNC_NO_DEFAULT = "sync_async_no_default"
31
31
  """Both synchronous and asynchronous clients are generated.
32
32
 
33
- The synchronous client is generated with the Sync suffix, and the asynchronous client is generated with the Async
33
+ Synchronous clients are generated with the Sync suffix, and asynchronous clients are generated with the Async
34
34
  suffix."""
35
35
 
36
36
  @property
@@ -60,8 +60,14 @@ class ClientGeneration(StrEnum):
60
60
  return self in {ClientGeneration.SYNC_ASYNC, ClientGeneration.SYNC_ASYNC_NO_DEFAULT}
61
61
 
62
62
 
63
+ class ServerGeneration(StrEnum):
64
+ NONE = "none"
65
+ ASYNC = "async"
66
+
67
+
63
68
  @dataclass
64
69
  class Settings:
65
70
  pydantic_dataclasses: bool
66
71
 
67
72
  client_generation: ClientGeneration
73
+ server_generation: ServerGeneration
@@ -18,8 +18,10 @@ __all__ = (
18
18
  {%- endfor -%}
19
19
  )
20
20
 
21
+ import re
21
22
  import builtins
22
23
  import datetime
24
+ import dateutil.parser
23
25
  import warnings
24
26
  from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator
25
27
  import typing
@@ -102,6 +102,7 @@ default_message_pool.register_message("{{ output_file.package }}", "{{ message.p
102
102
  {{ i }}
103
103
  {% endfor %}
104
104
 
105
+ {% if output_file.settings.server_generation == "async" %}
105
106
  {% for _, service in output_file.services|dictsort(by="key") %}
106
107
  class {{ service.py_name }}Base(ServiceBase):
107
108
  {% if service.comment %}
@@ -170,3 +171,4 @@ class {{ service.py_name }}Base(ServiceBase):
170
171
  }
171
172
 
172
173
  {% endfor %}
174
+ {% endif %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: betterproto2_compiler
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Compiler for betterproto2
5
5
  License: MIT
6
6
  Keywords: protobuf,gRPC,compiler
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
- Requires-Dist: betterproto2[grpclib] (>=0.4.0,<0.5.0)
16
+ Requires-Dist: betterproto2[grpclib] (>=0.5.1,<0.6.0)
17
17
  Requires-Dist: jinja2 (>=3.0.3)
18
18
  Requires-Dist: ruff (>=0.9.3,<0.10.0)
19
19
  Requires-Dist: strenum (>=0.4.15,<0.5.0) ; python_version == "3.10"
@@ -1,34 +1,35 @@
1
1
  betterproto2_compiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  betterproto2_compiler/casing.py,sha256=HSXLXAOqZzEnu-tC1SZjpW0LIjzdPqUNJEwy1BHzfgg,3056
3
3
  betterproto2_compiler/compile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- betterproto2_compiler/compile/importing.py,sha256=2DF9zpYhjX_H3PCyUHCXhho1J2QdGAtXitlNneZZfFs,7129
4
+ betterproto2_compiler/compile/importing.py,sha256=cJZ1BqjSHaDwXlfseH7f73pMnBZTiqLyOQfQfyganVM,6256
5
5
  betterproto2_compiler/compile/naming.py,sha256=zf0VOmNojzyv33upOGelGxjZTEDE8JULEEED5_3inHg,562
6
- betterproto2_compiler/known_types/__init__.py,sha256=Exqo-3ubDuik0TZDTw5ZPqf-dVb2uPJTZxMG7X58E6U,780
7
- betterproto2_compiler/known_types/any.py,sha256=eRMenvvrn-1Wiss3YxhqRsjZ4XqiqPb1YQuinoA8wI4,1899
8
- betterproto2_compiler/known_types/duration.py,sha256=jy9GPnQTT9qhi12pQDG_ptdFAdm2gYkq3NH75zUTDOU,895
9
- betterproto2_compiler/known_types/timestamp.py,sha256=dUfJmdrVg1NW-zkquAc8kxMH6nqdxQ2x_MKeP4N5ksY,2153
6
+ betterproto2_compiler/known_types/__init__.py,sha256=nrWckuv4hGhL8-tW7V5TD5qXs1Sa5vC7zMusGnz7jsE,3485
7
+ betterproto2_compiler/known_types/any.py,sha256=E3OoAoUU9xrGHmYEvF0YnrwQdTUuY4h54XbKU0eGxQ8,1897
8
+ betterproto2_compiler/known_types/duration.py,sha256=M-qsFeiHsw5Z_AoSata1ZUjfkhooP9WhrmecNfuP16k,2312
9
+ betterproto2_compiler/known_types/google_values.py,sha256=7JoPXVs6cVg_ihIWlWIDElSSuW0BymRnPHerz1bFuH4,6688
10
+ betterproto2_compiler/known_types/timestamp.py,sha256=y1sNWG2Q0FWv6nIte1UTifFVCsryp7T8foXZqp4qhQQ,3409
10
11
  betterproto2_compiler/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
12
  betterproto2_compiler/lib/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- betterproto2_compiler/lib/google/protobuf/__init__.py,sha256=g41P4o4VkHjz8ko5ndwZ-1tUaNTMCT29c6Snd9XSoDI,107931
13
- betterproto2_compiler/lib/google/protobuf/compiler/__init__.py,sha256=bxBif4bFkIAqRQ02lrx1n5Qjwkj_rgrFRogdLUeg-6Q,8906
13
+ betterproto2_compiler/lib/google/protobuf/__init__.py,sha256=yC7k_A1XA9-CPzhIaJfWJSIBpqyaLx7IVVuvXrqD-iQ,102114
14
+ betterproto2_compiler/lib/google/protobuf/compiler/__init__.py,sha256=IriT5naeEkcxA-R2EpzOGBMLVGgVO6CXqvrR8HVaR28,9600
14
15
  betterproto2_compiler/lib/message_pool.py,sha256=4-cRhhiM6bmfpUJZ8qxc8LEyqHBHpLCcotjbyZxl7JM,71
15
16
  betterproto2_compiler/plugin/__init__.py,sha256=L3pW0b4CvkM5x53x_sYt1kYiSFPO0_vaeH6EQPq9FAM,43
16
17
  betterproto2_compiler/plugin/__main__.py,sha256=vBQ82334kX06ImDbFlPFgiBRiLIinwNk3z8Khs6hd74,31
17
18
  betterproto2_compiler/plugin/compiler.py,sha256=3sPbCtdzjAGftVvoGe5dvxE8uTzJ78hABA-_f-1rEUo,2471
18
- betterproto2_compiler/plugin/main.py,sha256=gI2fSWc9U-fn6MOlkLg7iResr2YsXbdOge6SzNWxBAo,1302
19
- betterproto2_compiler/plugin/models.py,sha256=MIzmnekCuZrzixGthAw9B6p3hXAtk6YYjDLUVIsIs4o,21085
19
+ betterproto2_compiler/plugin/main.py,sha256=b1jDEdG1Iau-4cPq89uSjU0SHwC278SxqwiuFwIF8fA,1288
20
+ betterproto2_compiler/plugin/models.py,sha256=rzCKsdoV-0QCwmRN82x2QZ6029W9EAAJCFbLGMkVoz8,22215
20
21
  betterproto2_compiler/plugin/module_validation.py,sha256=JnP8dSN83eJJVDP_UPJsHzq7E7Md3lah0PnKXDbFW5Q,4808
21
- betterproto2_compiler/plugin/parser.py,sha256=1u-EeDHH0lRMFIbeHvqpmWiqUVip16cW8eQIhKmevyI,9952
22
+ betterproto2_compiler/plugin/parser.py,sha256=XJd7n78E6Gnv04L1faGyTCOV3v0sv1eD5-AenNhPDMQ,10197
22
23
  betterproto2_compiler/plugin/plugin.bat,sha256=lfLT1WguAXqyerLLsRL6BfHA0RqUE6QG79v-1BYVSpI,48
23
24
  betterproto2_compiler/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- betterproto2_compiler/settings.py,sha256=gbMgOQpUoKqxpW1HELnTUR6sntho5IuqWoktRrFNm1M,1871
25
- betterproto2_compiler/templates/header.py.j2,sha256=u7pIz9DJsFl4CxIGIosd8qPfhOOv1v6XA7nuo__SKPM,1589
25
+ betterproto2_compiler/settings.py,sha256=ggLU8qYTTACwdNN94cSznQchu-fJSJxZz041FXRwq7Y,1976
26
+ betterproto2_compiler/templates/header.py.j2,sha256=nTUJ-BioeTTCrEr2ZbxPPUl6iBqHOxXr_NAVOGa8jYg,1622
26
27
  betterproto2_compiler/templates/service_stub.py.j2,sha256=r0AefgNbDCh-iDgFNV7aNx8fNe5kQY-8TNew-T_tUXc,929
27
28
  betterproto2_compiler/templates/service_stub_async.py.j2,sha256=JNOAa8FPhzYS5D0zi0DPESVEwAjkdFsVQZ008Qi4JmE,2968
28
29
  betterproto2_compiler/templates/service_stub_sync.py.j2,sha256=V7HJIQJEgivX8VEBt7Ju6cXG5FeeCY9QyYMy1kicElM,2642
29
- betterproto2_compiler/templates/template.py.j2,sha256=-1fpTlu_DCIeios3CHZUzY3b28zcN2QKdkhGtSrFMbg,5344
30
- betterproto2_compiler-0.4.0.dist-info/LICENSE.md,sha256=Pgl2pReU-2yw2miGeQ55UFlyzqAZ_EpYVyZ2nWjwRv4,1121
31
- betterproto2_compiler-0.4.0.dist-info/METADATA,sha256=R4sJQ_oMrnS5wcdSq4LVoHhIud-paWgaoq3XAdiES20,1225
32
- betterproto2_compiler-0.4.0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
33
- betterproto2_compiler-0.4.0.dist-info/entry_points.txt,sha256=re3Qg8lLljbVobeeKH2f1FVQZ114wfZkGv3zCZTD8Ok,84
34
- betterproto2_compiler-0.4.0.dist-info/RECORD,,
30
+ betterproto2_compiler/templates/template.py.j2,sha256=kP1TMTK7BCv6sEFTGXPZs_jg39lC_IdvKTFWPHm8BgU,5415
31
+ betterproto2_compiler-0.5.1.dist-info/LICENSE.md,sha256=Pgl2pReU-2yw2miGeQ55UFlyzqAZ_EpYVyZ2nWjwRv4,1121
32
+ betterproto2_compiler-0.5.1.dist-info/METADATA,sha256=7wZ7cc4n5R4S9lnl2jBYY89Hib9WynJySv0zFk_3zjM,1225
33
+ betterproto2_compiler-0.5.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
34
+ betterproto2_compiler-0.5.1.dist-info/entry_points.txt,sha256=re3Qg8lLljbVobeeKH2f1FVQZ114wfZkGv3zCZTD8Ok,84
35
+ betterproto2_compiler-0.5.1.dist-info/RECORD,,