diff --git a/.travis.yml b/.travis.yml index c0302f0..dc0fd34 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,12 @@ language: rust rust: - 1.36.0 - 1.37.0 - - 1.38.0 - - 1.39.0 + # error on cfg(doctest) + # - 1.38.0 + # - 1.39.0 - 1.40.0 - 1.41.0 + - 1.42.0 - stable - beta - nightly @@ -22,6 +24,8 @@ matrix: - cargo fmt --version script: - cargo fmt -- --check + env: + - CHECK_FORMAT=true # Clippy - rust: stable @@ -30,6 +34,8 @@ matrix: script: # Fail if clippy output contains "error:" or "warning:" - cargo clippy 2>&1 | tee ./clippy.out && ! grep -qe "error:\|warning:" ./clippy.out + env: + - CHECK_SYNTAX=true # Test coverage (with Tarpaulin) - rust: stable @@ -39,6 +45,8 @@ matrix: - RUSTFLAGS="--cfg procmacro2_semver_exempt" cargo install cargo-tarpaulin --force script: - cargo tarpaulin -v --ciserver travis-ci --coveralls $TRAVIS_JOB_ID + env: + - COVERAGE_MEASUREMENT=true script: - cargo test diff --git a/yaserde/Cargo.toml b/yaserde/Cargo.toml index 316759f..63b740b 100644 --- a/yaserde/Cargo.toml +++ b/yaserde/Cargo.toml @@ -9,6 +9,7 @@ repository = "https://github.com/media-io/yaserde" homepage = "https://github.com/media-io/yaserde" documentation = "https://docs.rs/yaserde" readme = "../README.md" +edition = "2018" [dependencies] yaserde_derive = { version = "0.3.11", path = "../yaserde_derive", optional = true } diff --git a/yaserde/src/de/mod.rs b/yaserde/src/de/mod.rs index d696092..a894d28 100644 --- a/yaserde/src/de/mod.rs +++ b/yaserde/src/de/mod.rs @@ -1,10 +1,10 @@ //! Generic data structure deserialization framework. //! +use crate::YaDeserialize; use std::io::Read; use xml::name::OwnedName; use xml::reader::{EventReader, ParserConfig, XmlEvent}; -use YaDeserialize; pub fn from_str(s: &str) -> Result { from_reader(s.as_bytes()) diff --git a/yaserde/src/lib.rs b/yaserde/src/lib.rs index d01ce51..8796731 100644 --- a/yaserde/src/lib.rs +++ b/yaserde/src/lib.rs @@ -5,7 +5,7 @@ #[macro_use] extern crate log; -extern crate xml; + #[cfg(feature = "yaserde_derive")] #[allow(unused_imports)] #[macro_use] diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 3366e21..510099d 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -1,12 +1,12 @@ //! Generic data structure serialization framework. //! +use crate::YaSerialize; use std::io::{Cursor, Write}; use std::str; use xml; use xml::writer::XmlEvent; use xml::{EmitterConfig, EventWriter}; -use YaSerialize; pub fn to_string(model: &T) -> Result { let buf = Cursor::new(Vec::new()); diff --git a/yaserde/tests/de_default.rs b/yaserde/tests/de_default.rs index 5654062..bb0c406 100644 --- a/yaserde/tests/de_default.rs +++ b/yaserde/tests/de_default.rs @@ -1,8 +1,4 @@ #[macro_use] -extern crate log; -extern crate xml; -extern crate yaserde; -#[macro_use] extern crate yaserde_derive; use std::io::Read; diff --git a/yaserde/tests/de_namespace.rs b/yaserde/tests/de_namespace.rs index d07d8a9..dd3d94c 100644 --- a/yaserde/tests/de_namespace.rs +++ b/yaserde/tests/de_namespace.rs @@ -1,8 +1,4 @@ #[macro_use] -extern crate log; -extern crate xml; -extern crate yaserde; -#[macro_use] extern crate yaserde_derive; use std::io::Read; diff --git a/yaserde/tests/de_option.rs b/yaserde/tests/de_option.rs index 7167885..a986ce4 100644 --- a/yaserde/tests/de_option.rs +++ b/yaserde/tests/de_option.rs @@ -1,8 +1,4 @@ #[macro_use] -extern crate log; -extern crate xml; -extern crate yaserde; -#[macro_use] extern crate yaserde_derive; use std::io::Read; diff --git a/yaserde/tests/de_type.rs b/yaserde/tests/de_type.rs index e6f82d1..b8775da 100644 --- a/yaserde/tests/de_type.rs +++ b/yaserde/tests/de_type.rs @@ -1,8 +1,4 @@ #[macro_use] -extern crate log; -extern crate xml; -extern crate yaserde; -#[macro_use] extern crate yaserde_derive; use std::io::Read; diff --git a/yaserde/tests/deserializer.rs b/yaserde/tests/deserializer.rs index fd06f20..21df4c0 100644 --- a/yaserde/tests/deserializer.rs +++ b/yaserde/tests/deserializer.rs @@ -1,8 +1,4 @@ #[macro_use] -extern crate log; -extern crate xml; -extern crate yaserde; -#[macro_use] extern crate yaserde_derive; use std::io::Read; diff --git a/yaserde/tests/errors.rs b/yaserde/tests/errors.rs index ac68639..d91aa8f 100644 --- a/yaserde/tests/errors.rs +++ b/yaserde/tests/errors.rs @@ -1,8 +1,4 @@ #[macro_use] -extern crate log; -extern crate xml; -extern crate yaserde; -#[macro_use] extern crate yaserde_derive; use std::io::Read; diff --git a/yaserde/tests/ser_default.rs b/yaserde/tests/ser_default.rs index 71c6225..b461a7e 100644 --- a/yaserde/tests/ser_default.rs +++ b/yaserde/tests/ser_default.rs @@ -1,6 +1,3 @@ -extern crate log; -extern crate xml; -extern crate yaserde; #[macro_use] extern crate yaserde_derive; diff --git a/yaserde/tests/ser_namespace.rs b/yaserde/tests/ser_namespace.rs index 0314d56..5af32e8 100644 --- a/yaserde/tests/ser_namespace.rs +++ b/yaserde/tests/ser_namespace.rs @@ -1,6 +1,3 @@ -extern crate log; -extern crate xml; -extern crate yaserde; #[macro_use] extern crate yaserde_derive; @@ -182,6 +179,29 @@ fn ser_struct_default_namespace_via_attribute() { convert_and_validate!(model, content); } +#[test] +fn ser_struct_default_namespace_via_attribute_with_prefix() { + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde( + root = "tt", + prefix = "TTML", + default_namespace = "TTML", + namespace = "TTML: http://www.w3.org/ns/ttml", + namespace = "ttm: http://www.w3.org/ns/ttml#metadata" + )] + pub struct XmlStruct { + #[yaserde(prefix = "TTML")] + item: String, + } + + let model = XmlStruct { + item: "something".to_string(), + }; + + let content = "something"; + convert_and_validate!(model, content); +} + #[test] fn ser_struct_namespace_nested() { #[derive(YaSerialize, Default, PartialEq, Debug)] diff --git a/yaserde/tests/ser_option.rs b/yaserde/tests/ser_option.rs index 5e34a6a..26f1c08 100644 --- a/yaserde/tests/ser_option.rs +++ b/yaserde/tests/ser_option.rs @@ -1,6 +1,3 @@ -extern crate log; -extern crate xml; -extern crate yaserde; #[macro_use] extern crate yaserde_derive; diff --git a/yaserde/tests/ser_skip.rs b/yaserde/tests/ser_skip.rs index fef63a8..53c6be0 100644 --- a/yaserde/tests/ser_skip.rs +++ b/yaserde/tests/ser_skip.rs @@ -1,6 +1,3 @@ -extern crate log; -extern crate xml; -extern crate yaserde; #[macro_use] extern crate yaserde_derive; diff --git a/yaserde/tests/ser_type.rs b/yaserde/tests/ser_type.rs index 3bf4934..1506cc2 100644 --- a/yaserde/tests/ser_type.rs +++ b/yaserde/tests/ser_type.rs @@ -1,6 +1,3 @@ -extern crate log; -extern crate xml; -extern crate yaserde; #[macro_use] extern crate yaserde_derive; diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index 3b73308..cd40425 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -1,6 +1,3 @@ -extern crate log; -extern crate xml; -extern crate yaserde; #[macro_use] extern crate yaserde_derive; diff --git a/yaserde_derive/Cargo.toml b/yaserde_derive/Cargo.toml index 0ce4b68..8b7ba13 100644 --- a/yaserde_derive/Cargo.toml +++ b/yaserde_derive/Cargo.toml @@ -9,6 +9,7 @@ repository = "https://github.com/media-io/yaserde" homepage = "https://github.com/media-io/yaserde" documentation = "https://docs.rs/yaserde" readme = "../README.md" +edition = "2018" [dependencies] syn = { version = "~1.0", features = ["visit", "extra-traits"] } diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index 6748e5f..4fdb0ed 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -1,5 +1,5 @@ -use attribute::*; -use field_type::*; +use crate::attribute::*; +use crate::field_type::*; use proc_macro2::TokenStream; use std::collections::BTreeMap; use syn::spanned::Spanned; diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 6e9b66d..1f1d51e 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -1,6 +1,6 @@ -use attribute::*; -use de::build_default_value::build_default_value; -use field_type::*; +use crate::attribute::*; +use crate::de::build_default_value::build_default_value; +use crate::field_type::*; use proc_macro2::{Span, TokenStream}; use std::collections::BTreeMap; use syn::spanned::Spanned; diff --git a/yaserde_derive/src/de/mod.rs b/yaserde_derive/src/de/mod.rs index 455303b..4e3e8ab 100644 --- a/yaserde_derive/src/de/mod.rs +++ b/yaserde_derive/src/de/mod.rs @@ -2,7 +2,7 @@ pub mod build_default_value; pub mod expand_enum; pub mod expand_struct; -use attribute; +use crate::attribute; use proc_macro2::TokenStream; use syn; use syn::Ident; diff --git a/yaserde_derive/src/ser/element.rs b/yaserde_derive/src/ser/element.rs index 5a18601..313be33 100644 --- a/yaserde_derive/src/ser/element.rs +++ b/yaserde_derive/src/ser/element.rs @@ -1,4 +1,4 @@ -use attribute::*; +use crate::attribute::*; use proc_macro2::{Ident, Span, TokenStream}; pub fn enclose_formatted_characters(label: &Ident, label_name: String) -> TokenStream { diff --git a/yaserde_derive/src/ser/expand_enum.rs b/yaserde_derive/src/ser/expand_enum.rs index 32f50ed..f1902be 100644 --- a/yaserde_derive/src/ser/expand_enum.rs +++ b/yaserde_derive/src/ser/expand_enum.rs @@ -1,5 +1,5 @@ -use attribute::*; -use field_type::*; +use crate::attribute::*; +use crate::field_type::*; use proc_macro2::TokenStream; use std::collections::BTreeMap; use syn::spanned::Spanned; diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 3c94d4b..1411a03 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -1,5 +1,6 @@ -use attribute::*; -use field_type::*; +use crate::attribute::*; +use crate::field_type::*; +use crate::ser::element::*; use proc_macro2::TokenStream; use std::collections::BTreeMap; use std::string::ToString; @@ -7,8 +8,6 @@ use syn::spanned::Spanned; use syn::DataStruct; use syn::Ident; -use ser::element::*; - pub fn serialize( data_struct: &DataStruct, name: &Ident, @@ -27,7 +26,7 @@ pub fn serialize( let label = &field.ident; - let label_name = build_label_name(&field, &field_attrs); + let label_name = build_label_name(&field, &field_attrs, default_namespace); get_field_type(field).and_then(|f| match f { FieldType::FieldTypeString @@ -240,7 +239,7 @@ pub fn serialize( )); } - let label_name = build_label_name(&field, &field_attrs); + let label_name = build_label_name(&field, &field_attrs, default_namespace); let conditions = condition_generator(label, &field_attrs); get_field_type(field).and_then(|f| match f { @@ -411,16 +410,24 @@ pub fn serialize( } } -fn build_label_name(field: &syn::Field, field_attrs: &YaSerdeAttribute) -> String { - format!( - "{}{}", +fn build_label_name( + field: &syn::Field, + field_attrs: &YaSerdeAttribute, + default_namespace: &Option, +) -> String { + let prefix = if default_namespace == &field_attrs.prefix { + "".to_string() + } else { field_attrs .prefix .clone() - .map_or("".to_string(), |prefix| prefix + ":"), - field_attrs - .rename - .clone() - .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()) - ) + .map_or("".to_string(), |prefix| prefix + ":") + }; + + let label = field_attrs + .rename + .clone() + .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()); + + format!("{}{}", prefix, label) } diff --git a/yaserde_derive/src/ser/mod.rs b/yaserde_derive/src/ser/mod.rs index d801b61..68a1532 100644 --- a/yaserde_derive/src/ser/mod.rs +++ b/yaserde_derive/src/ser/mod.rs @@ -2,7 +2,7 @@ pub mod element; pub mod expand_enum; pub mod expand_struct; -use attribute; +use crate::attribute; use proc_macro2::TokenStream; use syn; use syn::Ident; @@ -15,12 +15,16 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result expand_struct::serialize( data_struct,