You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2022/01/10 12:02:36 UTC
[avro] branch master updated: AVRO-3214 Rust: Support 'doc' attribute for FixedSchema (#1343)
This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/master by this push:
new 0811b82 AVRO-3214 Rust: Support 'doc' attribute for FixedSchema (#1343)
0811b82 is described below
commit 0811b827a233c415a5b48612817148b01db102ac
Author: Martin Grigorov <ma...@users.noreply.github.com>
AuthorDate: Mon Jan 10 14:02:30 2022 +0200
AVRO-3214 Rust: Support 'doc' attribute for FixedSchema (#1343)
---
lang/rust/src/decode.rs | 2 ++
lang/rust/src/schema.rs | 39 +++++++++++++++++++++++++++++++++--
lang/rust/src/schema_compatibility.rs | 2 ++
lang/rust/src/types.rs | 4 +++-
lang/rust/src/writer.rs | 2 ++
lang/rust/tests/schema.rs | 8 ++++++-
6 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/lang/rust/src/decode.rs b/lang/rust/src/decode.rs
index 0714dcd..5639d28 100644
--- a/lang/rust/src/decode.rs
+++ b/lang/rust/src/decode.rs
@@ -298,6 +298,7 @@ mod tests {
use num_bigint::ToBigInt;
let inner = Box::new(Schema::Fixed {
size: 2,
+ doc: None,
name: Name::new("decimal"),
});
let schema = Schema::Decimal {
@@ -323,6 +324,7 @@ mod tests {
let inner = Box::new(Schema::Fixed {
size: 13,
name: Name::new("decimal"),
+ doc: None,
});
let schema = Schema::Decimal {
inner,
diff --git a/lang/rust/src/schema.rs b/lang/rust/src/schema.rs
index da8c0c3..3617bb1 100644
--- a/lang/rust/src/schema.rs
+++ b/lang/rust/src/schema.rs
@@ -109,7 +109,11 @@ pub enum Schema {
symbols: Vec<String>,
},
/// A `fixed` Avro schema.
- Fixed { name: Name, size: usize },
+ Fixed {
+ name: Name,
+ doc: Documentation,
+ size: usize,
+ },
/// Logical type which represents `Decimal` values. The underlying type is serialized and
/// deserialized as `Schema::Bytes` or `Schema::Fixed`.
///
@@ -871,6 +875,11 @@ impl Parser {
fn parse_fixed(complex: &Map<String, Value>) -> AvroResult<Schema> {
let name = Name::parse(complex)?;
+ let doc = complex.get("doc").and_then(|v| match &v {
+ Value::String(ref docstr) => Some(docstr.clone()),
+ _ => None,
+ });
+
let size = complex
.get("size")
.and_then(|v| v.as_i64())
@@ -878,6 +887,7 @@ impl Parser {
Ok(Schema::Fixed {
name,
+ doc,
size: size as usize,
})
}
@@ -949,10 +959,17 @@ impl Serialize for Schema {
map.serialize_entry("symbols", symbols)?;
map.end()
}
- Schema::Fixed { ref name, ref size } => {
+ Schema::Fixed {
+ ref name,
+ ref doc,
+ ref size,
+ } => {
let mut map = serializer.serialize_map(None)?;
map.serialize_entry("type", "fixed")?;
map.serialize_entry("name", &name.name)?;
+ if let Some(ref docstr) = doc {
+ map.serialize_entry("doc", docstr)?;
+ }
map.serialize_entry("size", size)?;
map.end()
}
@@ -1011,6 +1028,7 @@ impl Serialize for Schema {
// duration should be or typically is.
let inner = Schema::Fixed {
name: Name::new("duration"),
+ doc: None,
size: 12,
};
map.serialize_entry("type", &inner)?;
@@ -1311,6 +1329,23 @@ mod tests {
let expected = Schema::Fixed {
name: Name::new("test"),
+ doc: None,
+ size: 16usize,
+ };
+
+ assert_eq!(expected, schema);
+ }
+
+ #[test]
+ fn test_fixed_schema_with_documentation() {
+ let schema = Schema::parse_str(
+ r#"{"type": "fixed", "name": "test", "size": 16, "doc": "FixedSchema documentation"}"#,
+ )
+ .unwrap();
+
+ let expected = Schema::Fixed {
+ name: Name::new("test"),
+ doc: Some(String::from("FixedSchema documentation")),
size: 16usize,
};
diff --git a/lang/rust/src/schema_compatibility.rs b/lang/rust/src/schema_compatibility.rs
index 7f2a5cf..5ba46e1 100644
--- a/lang/rust/src/schema_compatibility.rs
+++ b/lang/rust/src/schema_compatibility.rs
@@ -232,11 +232,13 @@ impl SchemaCompatibility {
SchemaKind::Fixed => {
if let Schema::Fixed {
name: w_name,
+ doc: _w_doc,
size: w_size,
} = writers_schema
{
if let Schema::Fixed {
name: r_name,
+ doc: _r_doc,
size: r_size,
} = readers_schema
{
diff --git a/lang/rust/src/types.rs b/lang/rust/src/types.rs
index 63876da..75f0509 100644
--- a/lang/rust/src/types.rs
+++ b/lang/rust/src/types.rs
@@ -840,6 +840,7 @@ mod tests {
let schema = Schema::Fixed {
size: 4,
name: Name::new("some_fixed"),
+ doc: None,
};
assert!(Value::Fixed(4, vec![0, 0, 0, 0]).validate(&schema));
@@ -1038,7 +1039,8 @@ mod tests {
scale: 1,
inner: Box::new(Schema::Fixed {
name: Name::new("decimal"),
- size: 20
+ size: 20,
+ doc: None
})
})
.is_ok());
diff --git a/lang/rust/src/writer.rs b/lang/rust/src/writer.rs
index efdd992..41e77c9 100644
--- a/lang/rust/src/writer.rs
+++ b/lang/rust/src/writer.rs
@@ -503,6 +503,7 @@ mod tests {
let size = 30;
let inner = Schema::Fixed {
name: Name::new("decimal"),
+ doc: None,
size,
};
let value = vec![0u8; size];
@@ -540,6 +541,7 @@ mod tests {
fn duration() -> TestResult<()> {
let inner = Schema::Fixed {
name: Name::new("duration"),
+ doc: None,
size: 12,
};
let value = Value::Duration(Duration::new(
diff --git a/lang/rust/tests/schema.rs b/lang/rust/tests/schema.rs
index d9fdefc..cc96429 100644
--- a/lang/rust/tests/schema.rs
+++ b/lang/rust/tests/schema.rs
@@ -336,6 +336,10 @@ const DOC_EXAMPLES: &[(&str, bool)] = &[
r#"{"type": "enum", "name": "Test", "symbols": ["A", "B"], "doc": "Doc String"}"#,
true,
),
+ (
+ r#"{"type": "fixed", "name": "Test", "size": 1, "doc": "Fixed Doc String"}"#,
+ true,
+ ),
];
const OTHER_ATTRIBUTES_EXAMPLES: &[(&str, bool)] = &[
@@ -1229,7 +1233,9 @@ fn test_doc_attributes() {
match schema {
Schema::Enum { doc, .. } => assert!(doc.is_some()),
Schema::Record { doc, .. } => assert!(doc.is_some()),
- _ => (),
+ Schema::Fixed { doc, .. } => assert!(doc.is_some()),
+ Schema::String => (),
+ _ => unreachable!("Unexpected schema type: {:?}", schema),
}
}