Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AVRO-3816: Deprecate Properties Sidecar #2403

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lang/py/avro/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ def convert(value: str, field: avro.schema.Field) -> Union[int, float, str, byte


def convert_union(value: str, field: avro.schema.Field) -> Union[int, float, str, bytes, bool, None]:
for name in (s.name for s in field.type.schemas):
for name in (s.name for s in cast(avro.schema.UnionSchema, field.type).schemas):
try:
return convert(value, name)
except ValueError:
Expand Down
28 changes: 21 additions & 7 deletions lang/py/avro/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,17 @@
import decimal
import struct
import warnings
from typing import IO, Generator, Iterable, List, Mapping, Optional, Sequence, Union
from typing import (
IO,
Generator,
Iterable,
List,
Mapping,
Optional,
Sequence,
Union,
cast,
)

import avro.constants
import avro.errors
Expand Down Expand Up @@ -683,23 +693,25 @@ def read_data(self, writers_schema: avro.schema.Schema, readers_schema: avro.sch
return decoder.read_double()
if writers_schema.type == "bytes":
if logical_type == "decimal":
precision = writers_schema.get_prop("precision")
writers_schema = cast(avro.schema.BytesDecimalSchema, writers_schema)
precision = writers_schema.precision
if not (isinstance(precision, int) and precision > 0):
warnings.warn(avro.errors.IgnoredLogicalType(f"Invalid decimal precision {precision}. Must be a positive integer."))
return decoder.read_bytes()
scale = writers_schema.get_prop("scale")
scale = writers_schema.scale
if not (isinstance(scale, int) and scale >= 0):
warnings.warn(avro.errors.IgnoredLogicalType(f"Invalid decimal scale {scale}. Must be a non-negative integer."))
return decoder.read_bytes()
return decoder.read_decimal_from_bytes(precision, scale)
return decoder.read_bytes()
if isinstance(writers_schema, avro.schema.FixedSchema) and isinstance(readers_schema, avro.schema.FixedSchema):
if logical_type == "decimal":
precision = writers_schema.get_prop("precision")
writers_schema = cast(avro.schema.FixedDecimalSchema, writers_schema)
precision = writers_schema.precision
if not (isinstance(precision, int) and precision > 0):
warnings.warn(avro.errors.IgnoredLogicalType(f"Invalid decimal precision {precision}. Must be a positive integer."))
return self.read_fixed(writers_schema, readers_schema, decoder)
scale = writers_schema.get_prop("scale")
scale = writers_schema.scale
if not (isinstance(scale, int) and scale >= 0):
warnings.warn(avro.errors.IgnoredLogicalType(f"Invalid decimal scale {scale}. Must be a non-negative integer."))
return self.read_fixed(writers_schema, readers_schema, decoder)
Expand Down Expand Up @@ -1055,7 +1067,8 @@ def write_data(self, writers_schema: avro.schema.Schema, datum: object, encoder:
raise avro.errors.AvroTypeException(writers_schema, datum)
if writers_schema.type == "bytes":
if logical_type == "decimal":
scale = writers_schema.get_prop("scale")
writers_schema = cast(avro.schema.BytesDecimalSchema, writers_schema)
scale = writers_schema.scale
if not (isinstance(scale, int) and scale >= 0):
warnings.warn(avro.errors.IgnoredLogicalType(f"Invalid decimal scale {scale}. Must be a non-negative integer."))
elif not isinstance(datum, decimal.Decimal):
Expand All @@ -1067,7 +1080,8 @@ def write_data(self, writers_schema: avro.schema.Schema, datum: object, encoder:
raise avro.errors.AvroTypeException(writers_schema, datum)
if isinstance(writers_schema, avro.schema.FixedSchema):
if logical_type == "decimal":
scale = writers_schema.get_prop("scale")
writers_schema = cast(avro.schema.FixedDecimalSchema, writers_schema)
scale = writers_schema.scale
size = writers_schema.size
if not (isinstance(scale, int) and scale >= 0):
warnings.warn(avro.errors.IgnoredLogicalType(f"Invalid decimal scale {scale}. Must be a non-negative integer."))
Expand Down
2 changes: 1 addition & 1 deletion lang/py/avro/name.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def space(self) -> Optional[str]:
return full.rsplit(".", 1)[0] if "." in full else None

def get_space(self) -> Optional[str]:
warnings.warn("Name.get_space() is deprecated in favor of Name.space")
warnings.warn("Name.get_space() is deprecated in favor of Name.space", DeprecationWarning)
return self.space


Expand Down
Loading