• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zbraniecki / icu4x / 13958601093

19 Mar 2025 04:17PM UTC coverage: 74.164% (-1.5%) from 75.71%
13958601093

push

github

web-flow
Clean up properties docs (#6315)

58056 of 78281 relevant lines covered (74.16%)

819371.32 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.66
/provider/source/src/displaynames/script.rs
1
// This file is part of ICU4X. For terms of use, please see the file
2
// called LICENSE at the top level of the ICU4X source tree
3
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4

5
use crate::cldr_serde;
6
use crate::IterableDataProviderCached;
7
use crate::SourceDataProvider;
8
use core::convert::TryFrom;
9
use icu::experimental::displaynames::provider::*;
10
use icu::locale::{subtags::Script, ParseError};
11
use icu_provider::prelude::*;
12
use std::collections::{BTreeMap, HashSet};
13

14
impl DataProvider<ScriptDisplayNamesV1> for SourceDataProvider {
15
    fn load(&self, req: DataRequest) -> Result<DataResponse<ScriptDisplayNamesV1>, DataError> {
19✔
16
        self.check_req::<ScriptDisplayNamesV1>(req)?;
19✔
17

18
        let data: &cldr_serde::displaynames::script::Resource = self
19✔
19
            .cldr()?
×
20
            .displaynames()
21
            .read_and_parse(req.id.locale, "scripts.json")?;
38✔
22

23
        Ok(DataResponse {
19✔
24
            metadata: Default::default(),
19✔
25
            payload: DataPayload::from_owned(ScriptDisplayNames::try_from(data).map_err(|e| {
19✔
26
                DataError::custom("data for ScriptDisplayNames").with_display_context(&e)
×
27
            })?),
×
28
        })
29
    }
19✔
30
}
31

32
impl IterableDataProviderCached<ScriptDisplayNamesV1> for SourceDataProvider {
33
    fn iter_ids_cached(&self) -> Result<HashSet<DataIdentifierCow<'static>>, DataError> {
1✔
34
        Ok(self
1✔
35
            .cldr()?
×
36
            .displaynames()
37
            .list_locales()?
×
38
            .filter(|locale| {
17✔
39
                // The directory might exist without scripts.json
40
                self.cldr()
17✔
41
                    .unwrap()
42
                    .displaynames()
43
                    .file_exists(locale, "scripts.json")
44
                    .unwrap_or_default()
45
            })
17✔
46
            .map(DataIdentifierCow::from_locale)
47
            .collect())
48
    }
1✔
49
}
50

51
/// Substring used to denote alternative display names data variants for a given script. For example: "BA-alt-short", "TL-alt-variant".
52
// TODO(#3316): Distinguish stand-alone ("Traditional Han") from default ("Traditional")
53
const ALT_SUBSTRING: &str = "-alt-";
54
/// Substring used to denote short display names data variants for a given script. For example: "az-alt-short".
55
const ALT_SHORT_SUBSTRING: &str = "-alt-short";
56

57
impl TryFrom<&cldr_serde::displaynames::script::Resource> for ScriptDisplayNames<'static> {
58
    type Error = ParseError;
59

60
    fn try_from(other: &cldr_serde::displaynames::script::Resource) -> Result<Self, Self::Error> {
19✔
61
        let mut names = BTreeMap::new();
19✔
62
        let mut short_names = BTreeMap::new();
19✔
63
        for entry in other.main.value.localedisplaynames.scripts.iter() {
3,055✔
64
            if let Some(script) = entry.0.strip_suffix(ALT_SHORT_SUBSTRING) {
3,036✔
65
                short_names.insert(Script::try_from_str(script)?.to_tinystr(), entry.1.as_str());
10✔
66
            } else if !entry.0.contains(ALT_SUBSTRING) {
3,026✔
67
                names.insert(
2,964✔
68
                    Script::try_from_str(entry.0)?.to_tinystr(),
2,964✔
69
                    entry.1.as_str(),
2,964✔
70
                );
71
            }
72
        }
73
        Ok(Self {
19✔
74
            // Old CLDR versions may contain trivial entries, so filter
75
            names: names
19✔
76
                .into_iter()
77
                .filter(|&(k, v)| k != v)
2,964✔
78
                .map(|(k, v)| (k.to_unvalidated(), v))
2,912✔
79
                .collect(),
80
            short_names: short_names
19✔
81
                .into_iter()
82
                .filter(|&(k, v)| k != v)
10✔
83
                .map(|(k, v)| (k.to_unvalidated(), v))
10✔
84
                .collect(),
85
        })
×
86
    }
19✔
87
}
88

89
#[cfg(test)]
90
mod tests {
91
    use super::*;
92
    use icu::locale::{langid, subtags::script};
93

94
    #[test]
95
    fn test_basic_script_display_names() {
2✔
96
        let provider = SourceDataProvider::new_testing();
1✔
97

98
        let data: DataPayload<ScriptDisplayNamesV1> = provider
1✔
99
            .load(DataRequest {
1✔
100
                id: DataIdentifierBorrowed::for_locale(&langid!("en-001").into()),
1✔
101
                ..Default::default()
1✔
102
            })
103
            .unwrap()
104
            .payload;
105

106
        assert_eq!(
1✔
107
            data.get()
2✔
108
                .names
109
                .get(&script!("Cans").to_tinystr().to_unvalidated())
1✔
110
                .unwrap(),
111
            "Unified Canadian Aboriginal Syllabics"
112
        );
113
    }
2✔
114

115
    #[test]
116
    fn test_basic_script_short_display_names() {
2✔
117
        let provider = SourceDataProvider::new_testing();
1✔
118

119
        let data: DataPayload<ScriptDisplayNamesV1> = provider
1✔
120
            .load(DataRequest {
1✔
121
                id: DataIdentifierBorrowed::for_locale(&langid!("en-001").into()),
1✔
122
                ..Default::default()
1✔
123
            })
124
            .unwrap()
125
            .payload;
126

127
        assert_eq!(
1✔
128
            data.get()
2✔
129
                .short_names
130
                .get(&script!("Cans").to_tinystr().to_unvalidated())
1✔
131
                .unwrap(),
132
            "UCAS"
133
        );
134
    }
2✔
135
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc