Skip to content

Commit b45c16c

Browse files
committed
move caching from TypedSchema class to higher level
1 parent edb09eb commit b45c16c

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

karapace/protobuf/exception.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
import json
66

77

8-
class ProtobufParserRuntimeException(Exception):
9-
pass
10-
11-
128
class IllegalStateException(Exception):
139
pass
1410

karapace/protobuf/schema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def collect_dependencies(self, verifier: ProtobufDependencyVerifier):
136136
self.dependencies[key].schema.schema.collect_dependencies(verifier)
137137

138138
# verifier.add_import?? we have no access to own Kafka structure from this class...
139-
# but we need data to analyse imports to avoid ciclyc dependencies...
139+
# but we need data to analyse imports to avoid cyclic dependencies...
140140

141141
package_name = self.proto_file_element.package_name
142142
if package_name is None:

karapace/schema_models.py

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
IllegalArgumentException,
1515
IllegalStateException,
1616
ProtobufException,
17-
ProtobufParserRuntimeException,
1817
ProtobufUnresolvedDependencyException,
1918
SchemaParseException as ProtobufSchemaParseException,
2019
)
@@ -114,7 +113,6 @@ def parse(
114113
TypeError,
115114
SchemaError,
116115
AssertionError,
117-
ProtobufParserRuntimeException,
118116
IllegalStateException,
119117
IllegalArgumentException,
120118
ProtobufError,
@@ -155,11 +153,10 @@ def __init__(
155153
self.schema_type = schema_type
156154
self.references = references
157155
self.dependencies = dependencies
158-
self.schema_str = TypedSchema.normalize_schema_str(schema_str, schema_type, references, dependencies)
156+
self.schema_str = TypedSchema.normalize_schema_str(schema_str, schema_type, schema)
159157
self.max_id: Optional[SchemaId] = None
160158
self._fingerprint_cached: Optional[str] = None
161159
self._str_cached: Optional[str] = None
162-
self._schema_cached: Optional[Union[Draft7Validator, AvroSchema, ProtobufSchema]] = schema
163160

164161
def to_dict(self) -> Dict[str, Any]:
165162
if self.schema_type is SchemaType.PROTOBUF:
@@ -175,8 +172,9 @@ def fingerprint(self) -> str:
175172
def normalize_schema_str(
176173
schema_str: str,
177174
schema_type: SchemaType,
178-
references: Optional[List[Reference]] = None,
179-
dependencies: Optional[Dict[str, Dependency]] = None,
175+
schema: Optional[Union[Draft7Validator, AvroSchema, ProtobufSchema]] = None,
176+
# references: Optional[List[Reference]] = None,
177+
# dependencies: Optional[Dict[str, Dependency]] = None,
180178
) -> str:
181179
if schema_type is SchemaType.AVRO or schema_type is SchemaType.JSONSCHEMA:
182180
try:
@@ -185,11 +183,15 @@ def normalize_schema_str(
185183
LOG.error("Schema is not valid JSON")
186184
raise e
187185
elif schema_type == SchemaType.PROTOBUF:
188-
try:
189-
schema_str = str(parse_protobuf_schema_definition(schema_str, references, dependencies, False))
190-
except InvalidSchema as e:
191-
LOG.exception("Schema is not valid ProtoBuf definition")
192-
raise e
186+
if schema:
187+
schema_str = str(schema)
188+
else:
189+
try:
190+
schema_str = str(parse_protobuf_schema_definition(schema_str, None, None, False))
191+
except InvalidSchema as e:
192+
LOG.exception("Schema is not valid ProtoBuf definition")
193+
raise e
194+
193195
else:
194196
_assert_never(schema_type)
195197
return schema_str
@@ -205,10 +207,16 @@ def __str__(self) -> str:
205207
def __repr__(self) -> str:
206208
return f"TypedSchema(type={self.schema_type}, schema={str(self)})"
207209

210+
def __eq__(self, other: Any) -> bool:
211+
return (
212+
isinstance(other, (TypedSchema))
213+
and self.schema_type is other.schema_type
214+
and str(self) == str(other)
215+
and self.references == other.references
216+
)
217+
208218
@property
209219
def schema(self) -> Union[Draft7Validator, AvroSchema, ProtobufSchema]:
210-
if self._schema_cached is not None:
211-
return self._schema_cached
212220
parsed_typed_schema = parse(
213221
schema_type=self.schema_type,
214222
schema_str=self.schema_str,
@@ -217,19 +225,7 @@ def schema(self) -> Union[Draft7Validator, AvroSchema, ProtobufSchema]:
217225
references=self.references,
218226
dependencies=self.dependencies,
219227
)
220-
self._schema_cached = parsed_typed_schema.schema
221-
return self._schema_cached
222-
223-
def get_references(self) -> Optional[List[Reference]]:
224-
return self.references
225-
226-
def __eq__(self, other: Any) -> bool:
227-
return (
228-
isinstance(other, (TypedSchema))
229-
and self.schema_type is other.schema_type
230-
and str(self) == str(other)
231-
and self.references == other.references
232-
)
228+
return parsed_typed_schema.schema
233229

234230

235231
class ParsedTypedSchema(TypedSchema):
@@ -259,6 +255,8 @@ def __init__(
259255
references: Optional[List[Reference]] = None,
260256
dependencies: Optional[Dict[str, Dependency]] = None,
261257
):
258+
self._schema_cached: Optional[Union[Draft7Validator, AvroSchema, ProtobufSchema]] = schema
259+
262260
super().__init__(
263261
schema_type=schema_type, schema_str=schema_str, references=references, dependencies=dependencies, schema=schema
264262
)
@@ -284,6 +282,16 @@ def __str__(self) -> str:
284282
return str(self.schema)
285283
return super().__str__()
286284

285+
@property
286+
def schema(self) -> Union[Draft7Validator, AvroSchema, ProtobufSchema]:
287+
if self._schema_cached is not None:
288+
return self._schema_cached
289+
self._schema_cached = super().schema
290+
return self._schema_cached
291+
292+
def get_references(self) -> Optional[List[Reference]]:
293+
return self.references
294+
287295

288296
class ValidatedTypedSchema(ParsedTypedSchema):
289297
"""Validated schema resource.

0 commit comments

Comments
 (0)