avrotize 2.21.0__py3-none-any.whl → 2.22.0__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.
@@ -15,6 +15,38 @@ JsonNode = Dict[str, 'JsonNode'] | List['JsonNode'] | str | None
15
15
 
16
16
  INDENT = ' '
17
17
 
18
+ # Python standard library modules that should not be shadowed by package names
19
+ PYTHON_STDLIB_MODULES = {
20
+ 'abc', 'aifc', 'argparse', 'array', 'ast', 'asynchat', 'asyncio', 'asyncore',
21
+ 'atexit', 'audioop', 'base64', 'bdb', 'binascii', 'binhex', 'bisect', 'builtins',
22
+ 'bz2', 'calendar', 'cgi', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs',
23
+ 'codeop', 'collections', 'colorsys', 'compileall', 'concurrent', 'configparser',
24
+ 'contextlib', 'contextvars', 'copy', 'copyreg', 'cProfile', 'crypt', 'csv',
25
+ 'ctypes', 'curses', 'dataclasses', 'datetime', 'dbm', 'decimal', 'difflib',
26
+ 'dis', 'distutils', 'doctest', 'email', 'encodings', 'enum', 'errno', 'faulthandler',
27
+ 'fcntl', 'filecmp', 'fileinput', 'fnmatch', 'fractions', 'ftplib', 'functools',
28
+ 'gc', 'getopt', 'getpass', 'gettext', 'glob', 'graphlib', 'grp', 'gzip',
29
+ 'hashlib', 'heapq', 'hmac', 'html', 'http', 'imaplib', 'imghdr', 'imp',
30
+ 'importlib', 'inspect', 'io', 'ipaddress', 'itertools', 'json', 'keyword',
31
+ 'lib2to3', 'linecache', 'locale', 'logging', 'lzma', 'mailbox', 'mailcap',
32
+ 'marshal', 'math', 'mimetypes', 'mmap', 'modulefinder', 'multiprocessing',
33
+ 'netrc', 'nis', 'nntplib', 'numbers', 'operator', 'optparse', 'os', 'ossaudiodev',
34
+ 'pathlib', 'pdb', 'pickle', 'pickletools', 'pipes', 'pkgutil', 'platform',
35
+ 'plistlib', 'poplib', 'posix', 'posixpath', 'pprint', 'profile', 'pstats',
36
+ 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'queue', 'quopri', 'random',
37
+ 're', 'readline', 'reprlib', 'resource', 'rlcompleter', 'runpy', 'sched',
38
+ 'secrets', 'select', 'selectors', 'shelve', 'shlex', 'shutil', 'signal',
39
+ 'site', 'smtpd', 'smtplib', 'sndhdr', 'socket', 'socketserver', 'spwd',
40
+ 'sqlite3', 'ssl', 'stat', 'statistics', 'string', 'stringprep', 'struct',
41
+ 'subprocess', 'sunau', 'symtable', 'sys', 'sysconfig', 'syslog', 'tabnanny',
42
+ 'tarfile', 'telnetlib', 'tempfile', 'termios', 'test', 'textwrap', 'threading',
43
+ 'time', 'timeit', 'tkinter', 'token', 'tokenize', 'trace', 'traceback',
44
+ 'tracemalloc', 'tty', 'turtle', 'turtledemo', 'types', 'typing', 'unicodedata',
45
+ 'unittest', 'urllib', 'uu', 'uuid', 'venv', 'warnings', 'wave', 'weakref',
46
+ 'webbrowser', 'winreg', 'winsound', 'wsgiref', 'xdrlib', 'xml', 'xmlrpc',
47
+ 'zipapp', 'zipfile', 'zipimport', 'zlib', 'zoneinfo',
48
+ }
49
+
18
50
 
19
51
  def is_python_reserved_word(word: str) -> bool:
20
52
  """Checks if a word is a Python reserved word"""
@@ -28,6 +60,13 @@ def is_python_reserved_word(word: str) -> bool:
28
60
  return word in reserved_words
29
61
 
30
62
 
63
+ def safe_package_name(name: str) -> str:
64
+ """Converts a name to a safe Python package name that won't shadow stdlib"""
65
+ if name.lower() in PYTHON_STDLIB_MODULES:
66
+ return f"{name}_types"
67
+ return name
68
+
69
+
31
70
  class StructureToPython:
32
71
  """ Converts JSON Structure schema to Python classes """
33
72
 
@@ -110,11 +149,38 @@ class StructureToPython:
110
149
  type_name.startswith('typing.Optional[') or type_name.startswith('typing.Union[') or \
111
150
  type_name == 'typing.Any'
112
151
 
152
+ def safe_identifier(self, name: str, class_name: str = '', fallback_prefix: str = 'field') -> str:
153
+ """Converts a name to a safe Python identifier.
154
+
155
+ Handles:
156
+ - Reserved words (append _)
157
+ - Numeric prefixes (prepend _)
158
+ - Special characters (replace with _)
159
+ - All-special-char names (use fallback_prefix)
160
+ - Class name collision (append _)
161
+ """
162
+ import re
163
+ # Replace invalid characters with underscores
164
+ safe = re.sub(r'[^a-zA-Z0-9_]', '_', str(name))
165
+ # Remove leading/trailing underscores from sanitization, but keep intentional ones
166
+ safe = safe.strip('_') if safe != name else safe
167
+ # If nothing left after removing special chars, use fallback
168
+ if not safe or not re.match(r'^[a-zA-Z_]', safe):
169
+ if safe and re.match(r'^[0-9]', safe):
170
+ safe = '_' + safe # Numeric prefix
171
+ else:
172
+ safe = fallback_prefix + '_' + (safe if safe else 'unnamed')
173
+ # Handle reserved words
174
+ if is_python_reserved_word(safe):
175
+ safe = safe + '_'
176
+ # Handle class name collision
177
+ if class_name and safe == class_name:
178
+ safe = safe + '_'
179
+ return safe
180
+
113
181
  def safe_name(self, name: str) -> str:
114
- """Converts a name to a safe Python name"""
115
- if is_python_reserved_word(name):
116
- return name + "_"
117
- return name
182
+ """Converts a name to a safe Python name (legacy wrapper)"""
183
+ return self.safe_identifier(name)
118
184
 
119
185
  def pascal_type_name(self, ref: str) -> str:
120
186
  """Converts a reference to a type name"""
@@ -286,6 +352,7 @@ class StructureToPython:
286
352
  class_name = pascal(explicit_name if explicit_name else structure_schema.get('name', 'UnnamedClass'))
287
353
  schema_namespace = structure_schema.get('namespace', parent_namespace)
288
354
  namespace = self.concat_namespace(self.base_package, schema_namespace).lower()
355
+ package_name = self.python_package_from_structure_type(schema_namespace, class_name)
289
356
  python_qualified_name = self.python_fully_qualified_name_from_structure_type(schema_namespace, class_name)
290
357
 
291
358
  if python_qualified_name in self.generated_types:
@@ -323,7 +390,7 @@ class StructureToPython:
323
390
  # Generate field docstrings
324
391
  field_docstrings = [{
325
392
  'name': self.safe_name(field['name']),
326
- 'original_name': field['name'],
393
+ 'original_name': field.get('json_name') or field['name'],
327
394
  'type': field['type'],
328
395
  'is_primitive': field['is_primitive'],
329
396
  'is_enum': field['is_enum'],
@@ -358,8 +425,8 @@ class StructureToPython:
358
425
  )
359
426
 
360
427
  if write_file:
361
- self.write_to_file(namespace, class_name, class_definition)
362
- self.generate_test_class(namespace, class_name, field_docstrings, import_types)
428
+ self.write_to_file(package_name, class_name, class_definition)
429
+ self.generate_test_class(package_name, class_name, field_docstrings, import_types)
363
430
 
364
431
  self.generated_types[python_qualified_name] = 'class'
365
432
  self.generated_structure_types[python_qualified_name] = structure_schema
@@ -368,7 +435,10 @@ class StructureToPython:
368
435
  def generate_field(self, prop_name: str, prop_schema: Dict, class_name: str,
369
436
  parent_namespace: str, required_props: List, import_types: Set[str]) -> Dict:
370
437
  """ Generates a field for a Python dataclass """
371
- field_name = prop_name
438
+ # Sanitize field name for Python identifier validity
439
+ field_name = self.safe_identifier(prop_name, class_name)
440
+ # Track if we need a field_name annotation for JSON serialization
441
+ needs_field_name_annotation = field_name != prop_name
372
442
 
373
443
  # Check if this is a const field
374
444
  if 'const' in prop_schema:
@@ -377,6 +447,7 @@ class StructureToPython:
377
447
  class_name, field_name, prop_schema, parent_namespace, import_types)
378
448
  return {
379
449
  'name': field_name,
450
+ 'json_name': prop_name if needs_field_name_annotation else None,
380
451
  'type': prop_type,
381
452
  'is_primitive': self.is_python_primitive(prop_type) or self.is_python_typing_struct(prop_type),
382
453
  'is_enum': False,
@@ -403,6 +474,7 @@ class StructureToPython:
403
474
 
404
475
  return {
405
476
  'name': field_name,
477
+ 'json_name': prop_name if needs_field_name_annotation else None,
406
478
  'type': prop_type,
407
479
  'is_primitive': self.is_python_primitive(prop_type) or self.is_python_typing_struct(prop_type),
408
480
  'is_enum': prop_type in self.generated_types and self.generated_types[prop_type] == 'enum',
@@ -424,6 +496,7 @@ class StructureToPython:
424
496
  class_name = pascal(structure_schema.get('name', field_name + 'Enum'))
425
497
  schema_namespace = structure_schema.get('namespace', parent_namespace)
426
498
  namespace = self.concat_namespace(self.base_package, schema_namespace).lower()
499
+ package_name = self.python_package_from_structure_type(schema_namespace, class_name)
427
500
  python_qualified_name = self.python_fully_qualified_name_from_structure_type(schema_namespace, class_name)
428
501
 
429
502
  if python_qualified_name in self.generated_types:
@@ -442,8 +515,8 @@ class StructureToPython:
442
515
  )
443
516
 
444
517
  if write_file:
445
- self.write_to_file(namespace, class_name, enum_definition)
446
- self.generate_test_enum(namespace, class_name, symbols)
518
+ self.write_to_file(package_name, class_name, enum_definition)
519
+ self.generate_test_enum(package_name, class_name, symbols)
447
520
 
448
521
  self.generated_types[python_qualified_name] = 'enum'
449
522
  self.generated_enum_symbols[python_qualified_name] = symbols
@@ -513,6 +586,7 @@ class StructureToPython:
513
586
  class_name = pascal(structure_schema.get('name', 'UnnamedMap'))
514
587
  schema_namespace = structure_schema.get('namespace', parent_namespace)
515
588
  namespace = self.concat_namespace(self.base_package, schema_namespace).lower()
589
+ package_name = self.python_package_from_structure_type(schema_namespace, class_name)
516
590
  python_qualified_name = self.python_fully_qualified_name_from_structure_type(schema_namespace, class_name)
517
591
 
518
592
  if python_qualified_name in self.generated_types:
@@ -537,7 +611,7 @@ class StructureToPython:
537
611
  )
538
612
 
539
613
  if write_file:
540
- self.write_to_file(namespace, class_name, map_definition)
614
+ self.write_to_file(package_name, class_name, map_definition)
541
615
 
542
616
  self.generated_types[python_qualified_name] = 'map'
543
617
  return python_qualified_name
@@ -623,7 +697,8 @@ class StructureToPython:
623
697
  import_types: Set[str]) -> None:
624
698
  """Generates a unit test class for a Python dataclass"""
625
699
  test_class_name = f"Test_{class_name}"
626
- tests_package_name = "test_" + package_name.replace('.', '_').lower()
700
+ # Use a simpler file naming scheme based on class name only
701
+ test_file_name = f"test_{class_name.lower()}"
627
702
  test_class_definition = process_template(
628
703
  "structuretopython/test_class.jinja",
629
704
  package_name=package_name,
@@ -636,7 +711,7 @@ class StructureToPython:
636
711
  )
637
712
 
638
713
  base_dir = os.path.join(self.output_dir, "tests")
639
- test_file_path = os.path.join(base_dir, f"{tests_package_name.replace('.', '_').lower()}.py")
714
+ test_file_path = os.path.join(base_dir, f"{test_file_name}.py")
640
715
  if not os.path.exists(os.path.dirname(test_file_path)):
641
716
  os.makedirs(os.path.dirname(test_file_path), exist_ok=True)
642
717
  with open(test_file_path, 'w', encoding='utf-8') as file:
@@ -645,7 +720,8 @@ class StructureToPython:
645
720
  def generate_test_enum(self, package_name: str, class_name: str, symbols: List[str]) -> None:
646
721
  """Generates a unit test class for a Python enum"""
647
722
  test_class_name = f"Test_{class_name}"
648
- tests_package_name = "test_" + package_name.replace('.', '_').lower()
723
+ # Use a simpler file naming scheme based on class name only
724
+ test_file_name = f"test_{class_name.lower()}"
649
725
  test_class_definition = process_template(
650
726
  "structuretopython/test_enum.jinja",
651
727
  package_name=package_name,
@@ -654,7 +730,7 @@ class StructureToPython:
654
730
  symbols=symbols
655
731
  )
656
732
  base_dir = os.path.join(self.output_dir, "tests")
657
- test_file_path = os.path.join(base_dir, f"{tests_package_name.replace('.', '_').lower()}.py")
733
+ test_file_path = os.path.join(base_dir, f"{test_file_name}.py")
658
734
  if not os.path.exists(os.path.dirname(test_file_path)):
659
735
  os.makedirs(os.path.dirname(test_file_path), exist_ok=True)
660
736
  with open(test_file_path, 'w', encoding='utf-8') as file:
@@ -662,9 +738,8 @@ class StructureToPython:
662
738
 
663
739
  def write_to_file(self, package: str, class_name: str, python_code: str):
664
740
  """Writes a Python class to a file"""
665
- # Add 'struct' module to the package path
666
- full_package = f"{package}.struct"
667
- parent_package_name = '.'.join(full_package.split('.')[:-1])
741
+ # The containing directory is the parent package (matches avrotopython.py)
742
+ parent_package_name = '.'.join(package.split('.')[:-1])
668
743
  parent_package_path = os.sep.join(parent_package_name.split('.')).lower()
669
744
  directory_path = os.path.join(self.output_dir, "src", parent_package_path)
670
745
  if not os.path.exists(directory_path):
@@ -777,7 +852,12 @@ class StructureToPython:
777
852
  def convert_structure_to_python(structure_schema_path, py_file_path, package_name='', dataclasses_json_annotation=False, avro_annotation=False):
778
853
  """Converts JSON Structure schema to Python dataclasses"""
779
854
  if not package_name:
780
- package_name = os.path.splitext(os.path.basename(structure_schema_path))[0].lower().replace('-', '_')
855
+ # Strip .json extension, then also strip .struct suffix if present (*.struct.json naming convention)
856
+ base_name = os.path.splitext(os.path.basename(structure_schema_path))[0]
857
+ if base_name.endswith('.struct'):
858
+ base_name = base_name[:-7] # Remove '.struct' suffix
859
+ package_name = base_name.lower().replace('-', '_')
860
+ package_name = safe_package_name(package_name)
781
861
 
782
862
  structure_to_python = StructureToPython(package_name, dataclasses_json_annotation=dataclasses_json_annotation, avro_annotation=avro_annotation)
783
863
  structure_to_python.convert(structure_schema_path, py_file_path)
@@ -785,6 +865,7 @@ def convert_structure_to_python(structure_schema_path, py_file_path, package_nam
785
865
 
786
866
  def convert_structure_schema_to_python(structure_schema, py_file_path, package_name='', dataclasses_json_annotation=False):
787
867
  """Converts JSON Structure schema to Python dataclasses"""
868
+ package_name = safe_package_name(package_name) if package_name else package_name
788
869
  structure_to_python = StructureToPython(package_name, dataclasses_json_annotation=dataclasses_json_annotation)
789
870
  if isinstance(structure_schema, dict):
790
871
  structure_schema = [structure_schema]
avrotize/structuretots.py CHANGED
@@ -329,7 +329,7 @@ class StructureToTypeScript:
329
329
  fields = []
330
330
  for prop_name, prop_schema in properties.items():
331
331
  field_type = self.convert_structure_type_to_typescript(
332
- class_name, prop_name, prop_schema, namespace, import_types)
332
+ class_name, prop_name, prop_schema, schema_namespace, import_types)
333
333
  is_required = prop_name in required_props
334
334
  is_optional = not is_required
335
335
  field_type_no_null = self.strip_nullable(field_type)
@@ -400,8 +400,10 @@ class StructureToTypeScript:
400
400
  write_file: bool = True) -> str:
401
401
  """ Generates a TypeScript enum from JSON Structure enum """
402
402
  enum_name = pascal(structure_schema.get('name', field_name + 'Enum'))
403
- namespace = self.concat_namespace(self.base_package, structure_schema.get('namespace', parent_namespace)).lower()
404
- typescript_qualified_name = self.typescript_fully_qualified_name_from_structure_type(parent_namespace, enum_name)
403
+ schema_namespace = structure_schema.get('namespace', parent_namespace)
404
+ namespace = self.concat_namespace(self.base_package, schema_namespace).lower()
405
+ # Use schema_namespace (not parent_namespace) to match the file location
406
+ typescript_qualified_name = self.typescript_fully_qualified_name_from_structure_type(schema_namespace, enum_name)
405
407
 
406
408
  if typescript_qualified_name in self.generated_types:
407
409
  return typescript_qualified_name
@@ -477,6 +479,7 @@ class StructureToTypeScript:
477
479
  """ Generates a TypeScript tuple type from JSON Structure tuple type """
478
480
  tuple_name = pascal(explicit_name if explicit_name else structure_schema.get('name', 'Tuple'))
479
481
  namespace = self.concat_namespace(self.base_package, structure_schema.get('namespace', parent_namespace)).lower()
482
+ schema_namespace = structure_schema.get('namespace', parent_namespace)
480
483
  typescript_qualified_name = self.typescript_fully_qualified_name_from_structure_type(parent_namespace, tuple_name)
481
484
 
482
485
  if typescript_qualified_name in self.generated_types:
@@ -487,7 +490,7 @@ class StructureToTypeScript:
487
490
  item_types = []
488
491
  for idx, item in enumerate(tuple_items):
489
492
  item_type = self.convert_structure_type_to_typescript(
490
- tuple_name, f'item{idx}', item, namespace, import_types)
493
+ tuple_name, f'item{idx}', item, schema_namespace, import_types)
491
494
  item_types.append(item_type)
492
495
 
493
496
  # TypeScript tuples are just arrays with fixed length and types
@@ -735,4 +738,4 @@ def convert_structure_schema_to_typescript(structure_schema: JsonNode, output_di
735
738
  avro_annotation: Whether to include Avro annotations
736
739
  """
737
740
  converter = StructureToTypeScript(package_name, typedjson_annotation, avro_annotation)
738
- converter.convert_schema(structure_schema, output_dir, package_name)
741
+ converter.convert_schema(structure_schema, output_dir, package_name)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: avrotize
3
- Version: 2.21.0
3
+ Version: 2.22.0
4
4
  Summary: Tools to convert from and to Avro Schema from various other schema languages.
5
5
  Author-email: Clemens Vasters <clemensv@microsoft.com>
6
6
  Requires-Python: >=3.10
@@ -1,6 +1,6 @@
1
1
  avrotize/__init__.py,sha256=t5h5wkHXr6M0mmHAB5rhjZ3Gxy9xutGTGIfojfao9rI,3820
2
2
  avrotize/__main__.py,sha256=5pY8dYAURcOnFRvgb6fgaOIa_SOzPLIWbU8-ZTQ0jG4,88
3
- avrotize/_version.py,sha256=bf4KNcBF9L-a9QOdPA5vh1kn4plN-XZsFCOsYIbiS1c,706
3
+ avrotize/_version.py,sha256=Lz3YaEDxgU9K9pMHrjQaxnWiYLkcYeae4-H-EdHDdz4,706
4
4
  avrotize/asn1toavro.py,sha256=QDNwfBfXMxSH-k487CA3CaGCGDzOLs4PpVbbENm5uF0,8386
5
5
  avrotize/avrotize.py,sha256=VHFpBltMVBpyt0ju3ZWW725BKjQ4Fk-nrAy8udW-X44,5713
6
6
  avrotize/avrotocpp.py,sha256=hRZV247_TDD7Sm6_8sFx-UH5SueLLx2Wg6TvAVUX0iE,25693
@@ -8,10 +8,10 @@ avrotize/avrotocsharp.py,sha256=k-tBex_vT-79yKZNetP9pKF63206NlT7KKBIXies9Cg,7140
8
8
  avrotize/avrotocsv.py,sha256=PaDEW2aGRFVNLwewWhJ3OwxbKFI3PBg_mTgtT4uLMko,3689
9
9
  avrotize/avrotodatapackage.py,sha256=zSCphLvCYiBKRAUCdccsr-4JysH3PyAS6fSgwa65Tss,7259
10
10
  avrotize/avrotodb.py,sha256=5fNJgz00VMimyOl7eI0lIxlcaN_JnN0mb2Q9lzCRecw,46989
11
- avrotize/avrotogo.py,sha256=RnycgAuGejq00hDdsUGdMHiJX6nr0VAqNArbCkTzUMg,21880
11
+ avrotize/avrotogo.py,sha256=H4jxdO7laRWKJuU6mytz2sgUa_20hZUlsBrUGrCe_UU,22405
12
12
  avrotize/avrotographql.py,sha256=i6G7xWjH_Lsn_CLiM4BCPb8OyZuCCpsYjXwXNTRMwEE,7394
13
13
  avrotize/avrotoiceberg.py,sha256=plVHGWkED1YDLcMDxL7NMdJl2f8G32hwlNWFrBLcsD8,9057
14
- avrotize/avrotojava.py,sha256=_G_67xi1H0Ctj9KagiCnVNETvyPicOYO8ASvz6e1XYE,131861
14
+ avrotize/avrotojava.py,sha256=NZZ7mUFVzvp7HBsU0XPiCwl4GVXE1RtS86pfNFJsIq8,135427
15
15
  avrotize/avrotojs.py,sha256=QjB6XjFnDrpZBZrrWqS0TN8fQfRXBfhHabfG73FOIo8,12249
16
16
  avrotize/avrotojsons.py,sha256=WXWniQqwcl8eU35VibDv7qJJwbiLV_yoWZ4JxiZ8mHA,21588
17
17
  avrotize/avrotojstruct.py,sha256=-Hs4Ta958bRKmOfSTzRFENABCZ6lQPSPbIBEXvOQD1M,14660
@@ -20,8 +20,8 @@ avrotize/avrotomd.py,sha256=WHPHnfmkI3xDNIHKZ3ReYxj6tib1eCny3JOznNSN6r8,5348
20
20
  avrotize/avrotools.py,sha256=dTbGgWQyKdSuvCf4yuoymwhYO5gX9ywPu-klIXYwKZM,6052
21
21
  avrotize/avrotoparquet.py,sha256=qm5hfia5elW1Yn4KACG8bbudLAqQSwGk3fIkTvdT5Rg,9088
22
22
  avrotize/avrotoproto.py,sha256=STqbdGjVrgKrlKXt-6dZlekW_Oq0W0StRx80St1XqIc,22486
23
- avrotize/avrotopython.py,sha256=sPsSLseSq-toKHnsFsYRRtGePGYospRz2mwGLep-POw,31147
24
- avrotize/avrotorust.py,sha256=QMIBNkFpDlH44kuQo24k5D-f0lmdhoA5b7hEbhKsnMw,22214
23
+ avrotize/avrotopython.py,sha256=7s73rKyaQDu5-uLnF4mK7Jat9F4jipQ-lLapPXg6aPI,34168
24
+ avrotize/avrotorust.py,sha256=HEcDirRBCbXQNNs_FmkT-sp1dWQgZ8A23qkQYUxVuXE,24255
25
25
  avrotize/avrotots.py,sha256=u_XLjlHN0Gof5QYlpqK4X9WoX9rL30TjQMPg4TiyYnI,33241
26
26
  avrotize/avrotoxsd.py,sha256=iGQq_8kC0kfKsqvqS6s_mO-kJ8N5G8vXOwqRI_DZUxc,17744
27
27
  avrotize/cddltostructure.py,sha256=MA2c-P3CIEAxEaBX-FF299gR55xcLEV3FrfTr2QfayM,74491
@@ -44,22 +44,22 @@ avrotize/proto3parser.py,sha256=MfE84c-oAWWuzYmKlEZ5g5LUF7YzZaASFh2trX3UCaw,1560
44
44
  avrotize/prototoavro.py,sha256=hqXBGRxYojaEbEgoHZxXwMG4R1nWC7UMl_XNLWfqH38,17346
45
45
  avrotize/structuretocddl.py,sha256=RK_dTJf0oAo6BIBM48NHRcWC96OtUjlgUC6HzXs5Lkk,21234
46
46
  avrotize/structuretocpp.py,sha256=tBWOvyZPYQ1CHN6RgDnWlmzJ1giOyQ9SlHBHWvhPyiw,35898
47
- avrotize/structuretocsharp.py,sha256=qYYAV6M8I2xv-VUzOobPT1_FYAoBBe0VRTMe9eY8r1g,122229
47
+ avrotize/structuretocsharp.py,sha256=Hi6C2HAIB3DxKZ4s8Q2_rK9QOqI_cLmObLkpwI3iO1o,123681
48
48
  avrotize/structuretocsv.py,sha256=w9cwXAnnakKaeTtXsLWWO8KwYnXUxyXvC7a-ZKs-E94,13851
49
49
  avrotize/structuretodatapackage.py,sha256=NEHRt30KfVDWH1EQakvuMdRZTtfVXx8fsaYud0ofb2g,29768
50
- avrotize/structuretodb.py,sha256=3QE_TCdNklGH5ymzGsEnX1sI4OhvX2AYKPH7xtR5tHk,43926
51
- avrotize/structuretogo.py,sha256=FNL5et5xxAoS0YSPJWGliWAFZPH_p8Nmu9pSEAT4J0U,32876
50
+ avrotize/structuretodb.py,sha256=uk4hKSRNw1JwOsWSZGECjSwvmTFUipRvMgTGlKnviCo,44860
51
+ avrotize/structuretogo.py,sha256=EtU7C5IqKzPrYaxKUQJMDMpk-rlc8eRwFzHe489jHp4,34100
52
52
  avrotize/structuretographql.py,sha256=wcGXnrup5v5saRa1BhR6o-X8q8ujsQMVqrFHQTBPjww,20468
53
53
  avrotize/structuretoiceberg.py,sha256=itKb33Kj-7-udk4eHTLmTEasIeh1ggpZ3e_bwCxLABM,15344
54
- avrotize/structuretojava.py,sha256=jG2Vcf1KdezWrZo5lsecxLnmnMw1rA96uOxVWJQ4Rso,43372
54
+ avrotize/structuretojava.py,sha256=r6YfI-_HtdeGqotL5W31WR5sz-TE1VLdDegctpjeiC4,47886
55
55
  avrotize/structuretojs.py,sha256=TJuhUGqn0F2omjPVcrPeFPHY2KynRceFg9gMGvEenxA,29608
56
56
  avrotize/structuretojsons.py,sha256=PJrQBaf6yQHu5eFkePxbjPBEmL-fYfX2wj6OmH1jsWw,22495
57
57
  avrotize/structuretokusto.py,sha256=rOKgYIcm7ZK8RS-VvMFPNzPzwtv7c4dIKU-fKjrJLyM,30618
58
58
  avrotize/structuretomd.py,sha256=exfCldYbieVdduhotSoLrxsbphmyJQyeQso9qv4qyUw,13642
59
59
  avrotize/structuretoproto.py,sha256=Aq0-fwMXSjjAxgZ5mq1kpo_TauigMRrJK9LNyoN-YGs,42679
60
- avrotize/structuretopython.py,sha256=Ub7gRtsMXGmWVN1qbBiHuYXa9Qo2CqsVQKrg9vpX7h4,39073
60
+ avrotize/structuretopython.py,sha256=d9EZVDHq7r-x0ZYZIRYfCP6kub7MkEROuvzjTJfNVv0,43958
61
61
  avrotize/structuretorust.py,sha256=ChRmO7uzU-pMdDdS0Vtg-MVUaOaNhNUPwH-ZKKOHglU,35134
62
- avrotize/structuretots.py,sha256=CcxY2EYf4QOG9-yC8TxStBWpk-QdhXKzL1zNHjVOBbw,35057
62
+ avrotize/structuretots.py,sha256=7jKoMOWwSJG_T_uZuEcPu-4d0dMuydAHvUhE86QSEJU,35274
63
63
  avrotize/structuretoxsd.py,sha256=01VpasyWSMOx04sILHLP7H-WkhGdXAEGKohUUfgrNf0,32797
64
64
  avrotize/xsdtoavro.py,sha256=nQtNH_3pEZBp67oUCPqzhvItEExHTe-8obsIfNRXt8Y,19064
65
65
  avrotize/avrotocpp/CMakeLists.txt.jinja,sha256=t2ADvvi3o20xfVrsRBaUvZlpVCDR4h6Szsf0GcuSkH0,3015
@@ -81,18 +81,18 @@ avrotize/avrotogo/go_helpers.jinja,sha256=WSjLIqkrYLUKdQBejEpOnNiENCaU8HQvm4gshy
81
81
  avrotize/avrotogo/go_struct.jinja,sha256=vI-xGVC1O7uAFYoY0T0kbT2Be5gFDkgc_UdFUbbpHZk,4272
82
82
  avrotize/avrotogo/go_test.jinja,sha256=r1tGQqHP5MiSRj3yQhPSQLNSx1ihfsl6MnUU7xbHAgM,1206
83
83
  avrotize/avrotogo/go_union.jinja,sha256=OcRVPWI-1OvYthh7cB-8RMT9nJEOStAQMfbW3b5hpUU,890
84
- avrotize/avrotojava/class_test.java.jinja,sha256=LvSZLumEBDZWHlXCbaJNlSb-ALILS2s9byIdGc7WHDM,9443
84
+ avrotize/avrotojava/class_test.java.jinja,sha256=H950i6RlEoOoJadgUbEWOaeLIR3M9NHEF_hm4wFwbJs,9225
85
85
  avrotize/avrotojava/enum_test.java.jinja,sha256=INIKtiKrZwSFXVXgv8ouvzGv8vzjWouRq3DAPqxRs8k,545
86
86
  avrotize/avrotojava/testproject.pom.jinja,sha256=qRKGs9cCfex0hNgryyIJLae-pSpP4LMpPYcn8H8bBvk,2072
87
87
  avrotize/avrotomd/README.md.jinja,sha256=efG9ly41AjNMuOOnq9U7LXEhGylfHhVTzqe_COM4cRM,999
88
- avrotize/avrotopython/dataclass_core.jinja,sha256=5rmmblfkaxdEWcSyqUQj0zzCsnDo8I8vVZ77uw3u548,10280
88
+ avrotize/avrotopython/dataclass_core.jinja,sha256=hvLtsN67dlPDmTIHScrUE0X1z3KxKMDPmIg80ziKCAk,10616
89
89
  avrotize/avrotopython/enum_core.jinja,sha256=QP5FDkMg5Si6xSHCr6L-nMe_94RH2mJdcAmFJH69BiY,2779
90
90
  avrotize/avrotopython/pyproject_toml.jinja,sha256=fEtJrk4pTrHCcvwpGf1KYoORA90HeJZdmeusx_WVAeo,462
91
- avrotize/avrotopython/test_class.jinja,sha256=8ltRlwUNehlWNjxvKuywzIRRDVsXLKa6u7EJneEQ6H4,3108
91
+ avrotize/avrotopython/test_class.jinja,sha256=h_8pyvrTRa9DTRzUP5tjnzXF4bMjbovqjNqDdx1CZYM,3203
92
92
  avrotize/avrotopython/test_enum.jinja,sha256=PeVxzC-gV5bizVnRs58RPoUDbXGI696B-VO4g-qB2lc,528
93
- avrotize/avrotorust/dataclass_enum.rs.jinja,sha256=-1-73XnG1k1eONMq7_aENVpoHOsMnj55CyjU3PT8M7U,2232
94
- avrotize/avrotorust/dataclass_struct.rs.jinja,sha256=AXFqCCW8fVdJXnSYTfpwKQeGG9JH8Goc3g1ILKEU-mE,7853
95
- avrotize/avrotorust/dataclass_union.rs.jinja,sha256=HuDKlM03hOkVx9Lm5p93IzQfUCokHz8wOu9iyEkwkUk,3801
93
+ avrotize/avrotorust/dataclass_enum.rs.jinja,sha256=g4aYp0a7Yk8jO6aIiTXU8Obm48Qv63zxbzGREsWBBK8,2102
94
+ avrotize/avrotorust/dataclass_struct.rs.jinja,sha256=_FAKZG9VSRhn5enJScH8Y3t5KJ0aXTRqzGbMTjO6-dk,8463
95
+ avrotize/avrotorust/dataclass_union.rs.jinja,sha256=Ye4zVqpHgFNMUuvULCqN1aCWqezbWHppF_N_0hU0W2U,4640
96
96
  avrotize/avrotots/class_core.ts.jinja,sha256=KEKSXsjPVTXP_LTOIUVjsTWfT3g1ZVSrGjy0UMkEj0g,5081
97
97
  avrotize/avrotots/class_test.ts.jinja,sha256=zm3wXaSJ225y7knLj6I9zjrkPTEROLHYmBr8eDo7pCo,2752
98
98
  avrotize/avrotots/enum_core.ts.jinja,sha256=6NN_nF2y9us2saM7Wag8IN73BdIF0vxhPxq83NQEnm8,1522
@@ -139,7 +139,7 @@ avrotize/structuretojava/choice_core.jinja,sha256=H-VhQzIIwgu9myuw3j9WxFx01maTOl
139
139
  avrotize/structuretojava/class_core.jinja,sha256=mn3KVnvIxHIUB1Tep_YeISnM7k6ytQdOynQ4sUGrCAc,981
140
140
  avrotize/structuretojava/enum_core.jinja,sha256=yXnXQbr3IEudUj5OOFqDUJT7TfGqAJMy6O6K5DQ1lUQ,487
141
141
  avrotize/structuretojava/equals_hashcode.jinja,sha256=m_6EBJdRfQWnP8dmEJ2vkosyFaNkVyYDtyb9RKQCZtQ,946
142
- avrotize/structuretojava/pom.xml.jinja,sha256=0Je9fnd0Gb1RSPoD_chu3fafIu8SnRPuCKCw0mPXOTc,1089
142
+ avrotize/structuretojava/pom.xml.jinja,sha256=DxGdDXa3XgdD5vMp498Fzf-nSEX3Fx4grKG09-g32Bg,1305
143
143
  avrotize/structuretojava/tuple_core.jinja,sha256=IZl3s_olYhwasA21uFqSZCyq4tLZ_jtQVD6ZQgUKmkk,1731
144
144
  avrotize/structuretojs/class_core.js.jinja,sha256=-DiN6dHxiEAc3bWCV6EAH1TpEdO2Fhs6d3tgYzxdLM4,779
145
145
  avrotize/structuretojs/enum_core.js.jinja,sha256=iMDePiuj4d7s7VuUOv3MnkFLKV9XBzReMR4TudZ3MbQ,205
@@ -148,7 +148,7 @@ avrotize/structuretojs/test_class.js.jinja,sha256=XTQEtuFRgQb0ixrA_E9uK3tM4OJCf3
148
148
  avrotize/structuretojs/test_enum.js.jinja,sha256=5vGrqUigmSFx_wFQQD-nE7P6o_HAyZEnmWpW0ScAkfw,1393
149
149
  avrotize/structuretojs/test_runner.js.jinja,sha256=RH-wqqBTVjiFzp0k5id5vtMGVllHTQbihnRRgsM5C7k,1185
150
150
  avrotize/structuretomd/README.md.jinja,sha256=UBBkspRnVI9E3RLRWPbxKSvoU9y4tKi1iqzn2iGJbDQ,4824
151
- avrotize/structuretopython/dataclass_core.jinja,sha256=fUTLjlRjkH0P-1lK91o4IKGFarjk1cnyhYhqA_9d5_s,15702
151
+ avrotize/structuretopython/dataclass_core.jinja,sha256=fNcGjBx4rgJZQ1rNqoJ5npWZwr8j75R61W3-kSskJqk,15793
152
152
  avrotize/structuretopython/enum_core.jinja,sha256=DDE7Mw9M2hjb0x1ErY9IvwASgAkI1hzFWjKbHsTfDRs,1253
153
153
  avrotize/structuretopython/map_alias.jinja,sha256=lq1vh37yrMTlOKQXhcu5xxkZg8kCDnskw1DUqW06aq0,567
154
154
  avrotize/structuretopython/pyproject_toml.jinja,sha256=IuMr-XjXVmTx1R91DGLJ6y3LskCBcwt-xxJNi5hR1qA,587
@@ -164,8 +164,8 @@ avrotize/structuretots/index.ts.jinja,sha256=-R4R_En1N4W_BEN3z3bLts9Xi4KnBTDLrYM
164
164
  avrotize/structuretots/package.json.jinja,sha256=OfJn4g68VhBP-yvJCdsWm_1RHx1kphsmdWpxu_Fst1E,819
165
165
  avrotize/structuretots/test_class.ts.jinja,sha256=7tJ6hPo3A9zToTkwolVyXYhmZ_E4uI_OnnYsUUzUEdQ,1180
166
166
  avrotize/structuretots/tsconfig.json.jinja,sha256=8Pl65JW8uOMEexxkteobo0ZEqsJBO31HegNRUrf8XGQ,515
167
- avrotize-2.21.0.dist-info/entry_points.txt,sha256=m8J2TWiqbZh7SBQezc1CNrM_GVPWf01zOFcAKhzCC0U,51
168
- avrotize-2.21.0.dist-info/licenses/LICENSE,sha256=xGtQGygTETTtDQJafZCUbpsed3GxO6grmqig-jGEuSk,11348
169
- avrotize-2.21.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
170
- avrotize-2.21.0.dist-info/METADATA,sha256=RN5Bzebf6IsPXbPK4bUjg_WB3aMtJSb9b9OenEA1g9I,80208
171
- avrotize-2.21.0.dist-info/RECORD,,
167
+ avrotize-2.22.0.dist-info/entry_points.txt,sha256=m8J2TWiqbZh7SBQezc1CNrM_GVPWf01zOFcAKhzCC0U,51
168
+ avrotize-2.22.0.dist-info/licenses/LICENSE,sha256=xGtQGygTETTtDQJafZCUbpsed3GxO6grmqig-jGEuSk,11348
169
+ avrotize-2.22.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
170
+ avrotize-2.22.0.dist-info/METADATA,sha256=nLTy8xDdjStpgRxX2cOBQ8WSgA_EDF6uHgnk-AQFij8,80208
171
+ avrotize-2.22.0.dist-info/RECORD,,