This is an automated email from the ASF dual-hosted git repository.
kriskras99 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro-rs.git
The following commit(s) were added to refs/heads/main by this push:
new af56163 fix!: Enum and Fixed would put `default` in
`custom_attributes` (#460)
af56163 is described below
commit af56163614c4b45fb0d8cfaec997ed07a75e34ec
Author: Kriskras99 <[email protected]>
AuthorDate: Mon Feb 16 14:52:41 2026 +0100
fix!: Enum and Fixed would put `default` in `custom_attributes` (#460)
* fix: Enum and Fixed would put `default` in `custom_attributes`
* feat!: Remove `default` field from Fixed as it does not exit in the
specification
* fix: Better name for test schema
Co-authored-by: Martin Grigorov <[email protected]>
---------
Co-authored-by: default <[email protected]>
Co-authored-by: Martin Grigorov <[email protected]>
---
avro/src/decode.rs | 2 -
avro/src/encode.rs | 1 -
avro/src/schema/mod.rs | 102 +++++++++++++++++++-------------
avro/src/schema/parser.rs | 15 +----
avro/src/schema_compatibility.rs | 2 -
avro/src/schema_equality.rs | 11 ----
avro/src/serde/derive.rs | 8 ---
avro/src/serde/ser_schema.rs | 10 ----
avro/src/types.rs | 12 +---
avro/src/writer.rs | 3 -
avro/tests/serde_human_readable_true.rs | 2 +-
avro_derive/tests/derive.rs | 1 -
12 files changed, 65 insertions(+), 104 deletions(-)
diff --git a/avro/src/decode.rs b/avro/src/decode.rs
index 1adc095..d88ab5f 100644
--- a/avro/src/decode.rs
+++ b/avro/src/decode.rs
@@ -450,7 +450,6 @@ mod tests {
name: Name::new("decimal")?,
aliases: None,
doc: None,
- default: None,
attributes: Default::default(),
}),
precision: 4,
@@ -894,7 +893,6 @@ mod tests {
name: "uuid".try_into()?,
aliases: None,
doc: None,
- default: None,
attributes: Default::default(),
};
diff --git a/avro/src/encode.rs b/avro/src/encode.rs
index 85c4461..7efe4a6 100644
--- a/avro/src/encode.rs
+++ b/avro/src/encode.rs
@@ -971,7 +971,6 @@ pub(crate) mod tests {
name: "uuid".try_into()?,
aliases: None,
doc: None,
- default: None,
attributes: Default::default(),
});
let value =
Value::Uuid(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000")?);
diff --git a/avro/src/schema/mod.rs b/avro/src/schema/mod.rs
index b283731..5d9e0ca 100644
--- a/avro/src/schema/mod.rs
+++ b/avro/src/schema/mod.rs
@@ -281,8 +281,6 @@ pub struct FixedSchema {
pub doc: Documentation,
/// The size of the fixed schema
pub size: usize,
- /// An optional default symbol used for compatibility
- pub default: Option<String>,
/// The custom attributes of the schema
#[builder(default = BTreeMap::new())]
pub attributes: BTreeMap<String, Value>,
@@ -294,16 +292,16 @@ impl FixedSchema {
S: Serializer,
{
map.serialize_entry("type", "fixed")?;
- if let Some(ref n) = self.name.namespace {
+ if let Some(n) = self.name.namespace.as_ref() {
map.serialize_entry("namespace", n)?;
}
map.serialize_entry("name", &self.name.name)?;
- if let Some(ref docstr) = self.doc {
+ if let Some(docstr) = self.doc.as_ref() {
map.serialize_entry("doc", docstr)?;
}
map.serialize_entry("size", &self.size)?;
- if let Some(ref aliases) = self.aliases {
+ if let Some(aliases) = self.aliases.as_ref() {
map.serialize_entry("aliases", aliases)?;
}
@@ -326,7 +324,6 @@ impl FixedSchema {
aliases: None,
doc: None,
size: self.size,
- default: None,
attributes: Default::default(),
}
}
@@ -783,7 +780,7 @@ impl Serialize for Schema {
doc,
fields,
attributes,
- ..
+ lookup: _lookup,
}) => {
let mut map = serializer.serialize_map(None)?;
map.serialize_entry("type", "record")?;
@@ -808,7 +805,8 @@ impl Serialize for Schema {
symbols,
aliases,
attributes,
- ..
+ default,
+ doc,
}) => {
let mut map = serializer.serialize_map(None)?;
map.serialize_entry("type", "enum")?;
@@ -821,6 +819,12 @@ impl Serialize for Schema {
if let Some(aliases) = aliases {
map.serialize_entry("aliases", aliases)?;
}
+ if let Some(default) = default {
+ map.serialize_entry("default", default)?;
+ }
+ if let Some(doc) = doc {
+ map.serialize_entry("doc", doc)?;
+ }
for attr in attributes {
map.serialize_entry(attr.0, attr.1)?;
}
@@ -1947,7 +1951,6 @@ mod tests {
aliases: None,
doc: None,
size: 456,
- default: None,
attributes: Default::default(),
}),
order: RecordFieldOrder::Ascending,
@@ -1967,7 +1970,6 @@ mod tests {
aliases: None,
doc: None,
size: 456,
- default: None,
attributes: Default::default(),
}),
order: RecordFieldOrder::Ascending,
@@ -2043,7 +2045,6 @@ mod tests {
aliases: None,
doc: None,
size: 16_usize,
- default: None,
attributes: Default::default(),
});
@@ -2063,7 +2064,6 @@ mod tests {
aliases: None,
doc: Some(String::from("FixedSchema documentation")),
size: 16_usize,
- default: None,
attributes: Default::default(),
});
@@ -4309,7 +4309,6 @@ mod tests {
aliases: None,
doc: None,
size: 1,
- default: None,
attributes: attributes.clone(),
});
let serialized = serde_json::to_string(&schema)?;
@@ -4404,7 +4403,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
}))
);
@@ -4447,12 +4445,11 @@ mod tests {
aliases: None,
doc: None,
size: 6,
- default: None,
attributes: BTreeMap::new(),
})
);
assert_logged(
- r#"Ignoring uuid logical type for a Fixed schema because its size
(6) is not 16! Schema: Fixed(FixedSchema { name: Name { name: "FixedUUID",
namespace: None }, aliases: None, doc: None, size: 6, default: None,
attributes: {} })"#,
+ r#"Ignoring uuid logical type for a Fixed schema because its size
(6) is not 16! Schema: Fixed(FixedSchema { name: Name { name: "FixedUUID",
namespace: None }, aliases: None, doc: None, size: 6, attributes: {} })"#,
);
Ok(())
@@ -4596,7 +4593,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
}),
});
@@ -4767,28 +4763,6 @@ mod tests {
Ok(())
}
- #[test]
- fn avro_3965_fixed_schema_with_default_bigger_than_size() -> TestResult {
- match Schema::parse_str(
- r#"{
- "type": "fixed",
- "name": "test",
- "size": 1,
- "default": "123456789"
- }"#,
- ) {
- Ok(_schema) => panic!("Must fail!"),
- Err(err) => {
- assert_eq!(
- err.to_string(),
- "Fixed schema's default value length (9) does not match
its size (1)"
- );
- }
- }
-
- Ok(())
- }
-
#[test]
fn avro_4004_canonical_form_strip_logical_types() -> TestResult {
let schema_str = r#"
@@ -5015,7 +4989,6 @@ mod tests {
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: BTreeMap::new(),
});
@@ -5147,6 +5120,55 @@ mod tests {
error,
Details::ParsePrimitiveSimilar("bool".to_string(),
"boolean").to_string()
);
+
+ Ok(())
+ }
+
+ #[test]
+ fn avro_rs_460_fixed_default_in_custom_attributes() -> TestResult {
+ let schema = Schema::parse_str(
+ r#"{
+ "name": "fixed_with_default",
+ "type": "fixed",
+ "size": 1,
+ "default": "\u0000",
+ "doc": "a docstring"
+ }"#,
+ )?;
+
+ assert_eq!(schema.custom_attributes().unwrap().len(), 1);
+
+ let json = serde_json::to_string(&schema)?;
+ let schema2 = Schema::parse_str(&json)?;
+
+ assert_eq!(schema2.custom_attributes().unwrap().len(), 1);
+
+ Ok(())
+ }
+
+ #[test]
+ fn avro_rs_460_enum_default_in_custom_attributes() -> TestResult {
+ let schema = Schema::parse_str(
+ r#"{
+ "name": "enum_with_default",
+ "type": "enum",
+ "symbols": ["A", "B", "C"],
+ "default": "A",
+ "doc": "a docstring"
+ }"#,
+ )?;
+
+ assert_eq!(schema.custom_attributes().unwrap(), &BTreeMap::new());
+
+ let json = serde_json::to_string(&schema)?;
+ let schema2 = Schema::parse_str(&json)?;
+
+ let Schema::Enum(enum_schema) = schema2 else {
+ panic!("Expected Schema::Enum, got {schema2:?}");
+ };
+ assert!(enum_schema.default.is_some());
+ assert!(enum_schema.doc.is_some());
+
Ok(())
}
}
diff --git a/avro/src/schema/parser.rs b/avro/src/schema/parser.rs
index eb1b849..9500b82 100644
--- a/avro/src/schema/parser.rs
+++ b/avro/src/schema/parser.rs
@@ -690,7 +690,7 @@ impl Parser {
doc: complex.doc(),
symbols,
default,
- attributes: self.get_custom_attributes(complex, vec!["symbols"]),
+ attributes: self.get_custom_attributes(complex, vec!["symbols",
"default"]),
});
self.register_parsed_schema(&fully_qualified_name, &schema, &aliases);
@@ -787,18 +787,6 @@ impl Parser {
None => Err(Details::GetFixedSizeField),
}?;
- let default = complex.get("default").and_then(|v| match &v {
- &Value::String(default) => Some(default.clone()),
- _ => None,
- });
-
- if default.is_some() {
- let len = default.clone().unwrap().len();
- if len != size as usize {
- return Err(Details::FixedDefaultLenSizeMismatch(len,
size).into());
- }
- }
-
let fully_qualified_name = Name::parse(complex, enclosing_namespace)?;
let aliases =
self.fix_aliases_namespace(complex.aliases(),
&fully_qualified_name.namespace);
@@ -808,7 +796,6 @@ impl Parser {
aliases: aliases.clone(),
doc,
size: size as usize,
- default,
attributes: self.get_custom_attributes(complex, vec!["size"]),
});
diff --git a/avro/src/schema_compatibility.rs b/avro/src/schema_compatibility.rs
index 00a4063..7d9c611 100644
--- a/avro/src/schema_compatibility.rs
+++ b/avro/src/schema_compatibility.rs
@@ -857,7 +857,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
};
@@ -1700,7 +1699,6 @@ mod tests {
aliases: None,
doc: None,
size: 20,
- default: None,
attributes: BTreeMap::default(),
}),
});
diff --git a/avro/src/schema_equality.rs b/avro/src/schema_equality.rs
index d8f1558..e65e28c 100644
--- a/avro/src/schema_equality.rs
+++ b/avro/src/schema_equality.rs
@@ -315,7 +315,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let schema_two = Schema::Duration(FixedSchema {
@@ -323,7 +322,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let specification_eq_res = SPECIFICATION_EQ.compare(&schema_one,
&schema_two);
@@ -338,7 +336,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let schema_two = Schema::Duration(FixedSchema {
@@ -346,7 +343,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let specification_eq_res = SPECIFICATION_EQ.compare(&schema_one,
&schema_two);
@@ -363,7 +359,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: vec![(String::from("attr1"),
serde_json::Value::Bool(true))]
.into_iter()
.collect(),
@@ -373,7 +368,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let specification_eq_res = SPECIFICATION_EQ.compare(&schema_one,
&schema_two);
@@ -394,7 +388,6 @@ mod tests {
size: 8,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let schema_two = Schema::Duration(FixedSchema {
@@ -402,7 +395,6 @@ mod tests {
size: 12,
aliases: None,
doc: None,
- default: None,
attributes: BTreeMap::new(),
});
let specification_eq_res = SPECIFICATION_EQ.compare(&schema_one,
&schema_two);
@@ -537,7 +529,6 @@ mod tests {
name: Name::try_from("fixed").expect("Name is valid"),
doc: None,
size: 10,
- default: None,
aliases: None,
attributes: BTreeMap::new(),
});
@@ -548,7 +539,6 @@ mod tests {
name: Name::try_from("fixed").expect("Name is valid"),
doc: None,
size: 10,
- default: None,
aliases: None,
attributes: BTreeMap::new(),
});
@@ -713,7 +703,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
};
let fixed = Schema::Uuid(UuidSchema::Fixed(fixed_schema.clone()));
diff --git a/avro/src/serde/derive.rs b/avro/src/serde/derive.rs
index 451f0b1..c631db9 100644
--- a/avro/src/serde/derive.rs
+++ b/avro/src/serde/derive.rs
@@ -614,7 +614,6 @@ impl AvroSchemaComponent for core::time::Duration {
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: Default::default(),
});
named_schemas.insert(name, schema.clone());
@@ -648,7 +647,6 @@ impl AvroSchemaComponent for uuid::Uuid {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
}));
named_schemas.insert(name, schema.clone());
@@ -680,7 +678,6 @@ impl AvroSchemaComponent for u64 {
aliases: None,
doc: None,
size: 8,
- default: None,
attributes: Default::default(),
});
named_schemas.insert(name, schema.clone());
@@ -712,7 +709,6 @@ impl AvroSchemaComponent for u128 {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
});
named_schemas.insert(name, schema.clone());
@@ -744,7 +740,6 @@ impl AvroSchemaComponent for i128 {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
});
named_schemas.insert(name, schema.clone());
@@ -834,7 +829,6 @@ mod tests {
aliases: None,
doc: None,
size: 8,
- default: None,
attributes: Default::default(),
})
);
@@ -852,7 +846,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
})
);
@@ -870,7 +863,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
})
);
diff --git a/avro/src/serde/ser_schema.rs b/avro/src/serde/ser_schema.rs
index 63ecdad..fb222a0 100644
--- a/avro/src/serde/ser_schema.rs
+++ b/avro/src/serde/ser_schema.rs
@@ -3322,7 +3322,6 @@ mod tests {
aliases: None,
doc: None,
size: 4,
- default: None,
attributes: Default::default(),
});
@@ -3374,7 +3373,6 @@ mod tests {
aliases: None,
doc: None,
size: 4,
- default: None,
attributes: Default::default(),
});
@@ -3398,7 +3396,6 @@ mod tests {
aliases: None,
doc: None,
size: 4,
- default: None,
attributes: Default::default(),
});
@@ -3421,7 +3418,6 @@ mod tests {
aliases: None,
doc: None,
size: 1,
- default: None,
attributes: Default::default(),
});
@@ -3444,7 +3440,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
});
@@ -3473,7 +3468,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
});
@@ -3496,7 +3490,6 @@ mod tests {
aliases: None,
doc: None,
size: 8,
- default: None,
attributes: Default::default(),
});
@@ -3519,7 +3512,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
});
@@ -3548,7 +3540,6 @@ mod tests {
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
});
@@ -3571,7 +3562,6 @@ mod tests {
aliases: None,
doc: None,
size: 8,
- default: None,
attributes: Default::default(),
});
diff --git a/avro/src/types.rs b/avro/src/types.rs
index 28c3749..d070fe5 100644
--- a/avro/src/types.rs
+++ b/avro/src/types.rs
@@ -1361,7 +1361,6 @@ mod tests {
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: BTreeMap::new(),
}),
true,
@@ -1374,11 +1373,10 @@ mod tests {
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: BTreeMap::new(),
}),
false,
- "Invalid value: Fixed(11, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
for schema: Duration(FixedSchema { name: Name { name: \"TestName\", namespace:
None }, aliases: None, doc: None, size: 12, default: None, attributes: {} }).
Reason: The value's size ('11') must be exactly 12 to be a Duration",
+ "Invalid value: Fixed(11, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
for schema: Duration(FixedSchema { name: Name { name: \"TestName\", namespace:
None }, aliases: None, doc: None, size: 12, attributes: {} }). Reason: The
value's size ('11') must be exactly 12 to be a Duration",
),
(
Value::Record(vec![("unknown_field_name".to_string(),
Value::Null)]),
@@ -1453,7 +1451,6 @@ mod tests {
name: Name::new("some_fixed").unwrap(),
aliases: None,
doc: None,
- default: None,
attributes: Default::default(),
});
@@ -1824,7 +1821,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
size: 20,
doc: None,
- default: None,
attributes: Default::default(),
})
}))
@@ -1929,7 +1925,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: BTreeMap::new()
}))
.is_ok()
@@ -1942,7 +1937,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: BTreeMap::new()
}))
.is_err()
@@ -1975,7 +1969,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
doc: None,
size: 16,
- default: None,
attributes: Default::default(),
})))
.is_ok()
@@ -3184,7 +3177,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
doc: None,
size: 3,
- default: None,
attributes: Default::default()
}))?,
Value::Fixed(3, vec![97, 98, 99])
@@ -3198,7 +3190,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
doc: None,
size: 3,
- default: None,
attributes: Default::default()
}))
.is_err(),
@@ -3212,7 +3203,6 @@ Field with name '"b"' is not a member of the map items"#,
aliases: None,
doc: None,
size: 3,
- default: None,
attributes: Default::default()
}))
.is_err(),
diff --git a/avro/src/writer.rs b/avro/src/writer.rs
index 1690259..d75dccb 100644
--- a/avro/src/writer.rs
+++ b/avro/src/writer.rs
@@ -1054,7 +1054,6 @@ mod tests {
aliases: None,
doc: None,
size,
- default: None,
attributes: Default::default(),
};
let inner = InnerDecimalSchema::Fixed(fixed.clone());
@@ -1095,7 +1094,6 @@ mod tests {
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: Default::default(),
});
let value = Value::Duration(Duration::new(
@@ -1110,7 +1108,6 @@ mod tests {
aliases: None,
doc: None,
size: 12,
- default: None,
attributes: Default::default(),
}),
value,
diff --git a/avro/tests/serde_human_readable_true.rs
b/avro/tests/serde_human_readable_true.rs
index 182839e..ca7a58b 100644
--- a/avro/tests/serde_human_readable_true.rs
+++ b/avro/tests/serde_human_readable_true.rs
@@ -129,7 +129,7 @@ fn avro_rs_440_uuid_fixed() -> TestResult {
let writer = SpecificSingleObjectWriter::new()?;
assert_eq!(
writer.write(uuid, &mut buffer).unwrap_err().to_string(),
- r#"Failed to serialize value of type string using schema
Uuid(Fixed(FixedSchema { name: Name { name: "uuid", namespace: None }, aliases:
None, doc: None, size: 16, default: None, attributes: {} })):
550e8400-e29b-41d4-a716-446655440000. Cause: Expected bytes but got a string.
Did you mean to use `Schema::Uuid(UuidSchema::String)` or
`utils::serde_set_human_readable(false)`?"#
+ r#"Failed to serialize value of type string using schema
Uuid(Fixed(FixedSchema { name: Name { name: "uuid", namespace: None }, aliases:
None, doc: None, size: 16, attributes: {} })):
550e8400-e29b-41d4-a716-446655440000. Cause: Expected bytes but got a string.
Did you mean to use `Schema::Uuid(UuidSchema::String)` or
`utils::serde_set_human_readable(false)`?"#
);
Ok(())
diff --git a/avro_derive/tests/derive.rs b/avro_derive/tests/derive.rs
index d6b1c4e..e52ba7b 100644
--- a/avro_derive/tests/derive.rs
+++ b/avro_derive/tests/derive.rs
@@ -1910,7 +1910,6 @@ fn avro_rs_397_with_generic() {
aliases: None,
doc: None,
size: N,
- default: None,
attributes: Default::default(),
})
}