Skip to content

Commit 7acd4e7

Browse files
committed
Split date and time data keys.
This is a first step towards fixing unicode-org#380.
1 parent 5887c4b commit 7acd4e7

File tree

336 files changed

+7747
-9169
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

336 files changed

+7747
-9169
lines changed

components/datetime/src/any.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ use icu_locid::Locale;
1616
use icu_provider::prelude::*;
1717

1818
use crate::provider::{
19-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
19+
calendar::{
20+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
21+
TimePatternsV1Marker,
22+
},
2023
week_data::WeekDataV1Marker,
2124
};
2225
use crate::{date::DateTimeInput, DateTimeFormatError, FormattedDateTime};
@@ -70,8 +73,9 @@ impl AnyDateTimeFormat {
7073
/// Construct a new [`AnyDateTimeFormat`] from a data provider that implements
7174
/// [`AnyProvider`].
7275
///
73-
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/lengths@1`,
74-
/// `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
76+
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/timelengths@1`,
77+
/// `datetime/timelengths@1`, `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
78+
7579
///
7680
/// Furthermore, based on the type of calendar used, one of the following data keys may be necessary:
7781
///
@@ -92,8 +96,8 @@ impl AnyDateTimeFormat {
9296
/// Construct a new [`AnyDateTimeFormat`] from a data provider that implements
9397
/// [`BufferProvider`].
9498
///
95-
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/lengths@1`,
96-
/// `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
99+
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/datelengths@1`,
100+
/// `datetime/timelengths@1`, `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
97101
///
98102
/// Furthermore, based on the type of calendar used, one of the following data keys may be necessary:
99103
///
@@ -176,6 +180,7 @@ impl AnyDateTimeFormat {
176180
T: Into<Locale>,
177181
P: ResourceProvider<DateSymbolsV1Marker>
178182
+ ResourceProvider<DatePatternsV1Marker>
183+
+ ResourceProvider<TimePatternsV1Marker>
179184
+ ResourceProvider<DateSkeletonPatternsV1Marker>
180185
+ ResourceProvider<OrdinalV1Marker>
181186
+ ResourceProvider<WeekDataV1Marker>

components/datetime/src/datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
88
use crate::{
99
options::{components, DateTimeFormatOptions},
10-
provider::calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
10+
provider::calendar::{
11+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
12+
TimePatternsV1Marker,
13+
},
1114
provider::week_data::WeekDataV1Marker,
1215
raw,
1316
};
@@ -88,6 +91,7 @@ impl<C: CldrCalendar> DateTimeFormat<C> {
8891
where
8992
D: ResourceProvider<DateSymbolsV1Marker>
9093
+ ResourceProvider<DatePatternsV1Marker>
94+
+ ResourceProvider<TimePatternsV1Marker>
9195
+ ResourceProvider<DateSkeletonPatternsV1Marker>
9296
+ ResourceProvider<DecimalSymbolsV1Marker>
9397
+ ResourceProvider<OrdinalV1Marker>

components/datetime/src/provider/calendar/mod.rs

+15-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use icu_provider::{yoke, zerofrom};
1313
pub use skeletons::*;
1414
pub use symbols::*;
1515

16-
#[icu_provider::data_struct(DatePatternsV1Marker = "datetime/lengths@1")]
16+
#[icu_provider::data_struct(DatePatternsV1Marker = "datetime/datelengths@1")]
1717
#[derive(Debug, PartialEq, Clone, Default)]
1818
#[cfg_attr(
1919
feature = "datagen",
@@ -25,6 +25,20 @@ pub struct DatePatternsV1<'data> {
2525
#[cfg_attr(feature = "serde", serde(borrow))]
2626
pub date: patterns::LengthPatternsV1<'data>,
2727

28+
/// Patterns used to combine date and time length patterns into full date_time patterns.
29+
#[cfg_attr(feature = "serde", serde(borrow))]
30+
pub length_combinations: patterns::GenericLengthPatternsV1<'data>,
31+
}
32+
33+
#[icu_provider::data_struct(TimePatternsV1Marker = "datetime/timelengths@1")]
34+
#[derive(Debug, PartialEq, Clone, Default)]
35+
#[cfg_attr(
36+
feature = "datagen",
37+
derive(serde::Serialize, crabbake::Bakeable),
38+
crabbake(path = icu_datetime::provider::calendar),
39+
)]
40+
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
41+
pub struct TimePatternsV1<'data> {
2842
/// These patterns are common uses of time formatting, broken down by the length of the
2943
/// pattern. Users can override the hour cycle with a preference, so there are two
3044
/// pattern groups stored here. Note that the pattern will contain either h11 or h12.
@@ -39,10 +53,6 @@ pub struct DatePatternsV1<'data> {
3953

4054
/// By default a locale will prefer one hour cycle type over another.
4155
pub preferred_hour_cycle: pattern::CoarseHourCycle,
42-
43-
/// Patterns used to combine date and time length patterns into full date_time patterns.
44-
#[cfg_attr(feature = "serde", serde(borrow))]
45-
pub length_combinations: patterns::GenericLengthPatternsV1<'data>,
4656
}
4757

4858
pub mod patterns {

components/datetime/src/provider/date_time.rs

+33-15
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ use crate::options::{components, length, preferences, DateTimeFormatOptions};
99
use crate::pattern::{hour_cycle, runtime::PatternPlurals};
1010
use crate::provider;
1111
use crate::provider::calendar::patterns::PatternPluralsV1;
12-
use crate::provider::calendar::DatePatternsV1;
1312
use crate::provider::calendar::{
1413
patterns::PatternPluralsFromPatternsV1Marker, DatePatternsV1Marker,
15-
DateSkeletonPatternsV1Marker,
14+
DateSkeletonPatternsV1Marker, TimePatternsV1Marker,
1615
};
16+
use crate::provider::calendar::{DatePatternsV1, TimePatternsV1};
1717
use crate::skeleton;
1818
use icu_calendar::types::Era;
1919
use icu_locid::Locale;
@@ -22,7 +22,7 @@ use icu_provider::prelude::*;
2222
type Result<T> = core::result::Result<T, DateTimeFormatError>;
2323

2424
fn pattern_for_time_length_inner<'data>(
25-
data: DatePatternsV1<'data>,
25+
data: TimePatternsV1<'data>,
2626
length: length::Time,
2727
preferences: &Option<preferences::Bag>,
2828
) -> PatternPlurals<'data> {
@@ -81,6 +81,7 @@ impl<D: ?Sized> Clone for PatternSelector<'_, D> {
8181
impl<D> PatternSelector<'_, D>
8282
where
8383
D: ResourceProvider<DatePatternsV1Marker>
84+
+ ResourceProvider<TimePatternsV1Marker>
8485
+ ResourceProvider<DateSkeletonPatternsV1Marker>
8586
+ ?Sized,
8687
{
@@ -123,7 +124,7 @@ where
123124
self,
124125
length: length::Date,
125126
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
126-
let patterns_data = self.patterns_data_payload()?;
127+
let patterns_data = self.date_patterns_data_payload()?;
127128
Ok(
128129
patterns_data.map_project_with_capture(length, |data, length, _| {
129130
let pattern = pattern_for_date_length_inner(data, length);
@@ -140,7 +141,7 @@ where
140141
length: length::Time,
141142
preferences: Option<preferences::Bag>,
142143
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
143-
let patterns_data = self.patterns_data_payload()?;
144+
let patterns_data = self.time_patterns_data_payload()?;
144145
Ok(patterns_data.map_project_with_capture(
145146
(length, preferences),
146147
|data, (length, preferences), _| {
@@ -158,23 +159,29 @@ where
158159
time_length: length::Time,
159160
preferences: Option<preferences::Bag>,
160161
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
161-
let patterns_data = self.patterns_data_payload()?;
162-
patterns_data.try_map_project_with_capture(
163-
(date_length, time_length, preferences),
164-
|data, (date_length, time_length, preferences), _| {
162+
let time_patterns_data = self.time_patterns_data_payload()?;
163+
164+
let date_patterns_data = self.date_patterns_data_payload()?;
165+
date_patterns_data.try_map_project_with_capture(
166+
(date_length, time_length, preferences, time_patterns_data),
167+
|data, (date_length, time_length, preferences, time_patterns_data), _| {
165168
let date = pattern_for_date_length_inner(data.clone(), date_length)
166169
.expect_pattern("Lengths are single patterns");
167-
let time = pattern_for_time_length_inner(data.clone(), time_length, &preferences)
168-
.expect_pattern("Lengths are single patterns");
169170

170171
let pattern = match date_length {
171172
length::Date::Full => data.length_combinations.full,
172173
length::Date::Long => data.length_combinations.long,
173174
length::Date::Medium => data.length_combinations.medium,
174175
length::Date::Short => data.length_combinations.short,
175176
};
176-
let pattern = pattern.combined(date, time)?;
177-
Ok(PatternPlurals::from(pattern).into())
177+
178+
let time = pattern_for_time_length_inner(
179+
time_patterns_data.get().clone(),
180+
time_length,
181+
&preferences,
182+
)
183+
.expect_pattern("Lengths are single patterns");
184+
Ok(PatternPlurals::from(pattern.combined(date, time)?).into())
178185
},
179186
)
180187
}
@@ -185,7 +192,7 @@ where
185192
components: &components::Bag,
186193
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
187194
let skeletons_data = self.skeleton_data_payload()?;
188-
let patterns_data = self.patterns_data_payload()?;
195+
let patterns_data = self.date_patterns_data_payload()?;
189196
// Not all skeletons are currently supported.
190197
let requested_fields = components.to_vec_fields();
191198
let patterns = match skeleton::create_best_pattern_for_fields(
@@ -204,7 +211,18 @@ where
204211
patterns.into_owned(),
205212
)))
206213
}
207-
fn patterns_data_payload(self) -> Result<DataPayload<DatePatternsV1Marker>> {
214+
fn date_patterns_data_payload(self) -> Result<DataPayload<DatePatternsV1Marker>> {
215+
let data = self
216+
.data_provider
217+
.load_resource(&DataRequest {
218+
options: ResourceOptions::from(self.locale),
219+
metadata: Default::default(),
220+
})?
221+
.take_payload()?;
222+
Ok(data)
223+
}
224+
225+
fn time_patterns_data_payload(self) -> Result<DataPayload<TimePatternsV1Marker>> {
208226
let data = self
209227
.data_provider
210228
.load_resource(&DataRequest {

components/datetime/src/raw/datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use crate::{
1010
options::components,
1111
options::DateTimeFormatOptions,
1212
provider::calendar::patterns::PatternPluralsFromPatternsV1Marker,
13-
provider::calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
13+
provider::calendar::{
14+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
15+
TimePatternsV1Marker,
16+
},
1417
provider::week_data::WeekDataV1Marker,
1518
};
1619
use alloc::string::String;
@@ -54,6 +57,7 @@ impl DateTimeFormat {
5457
where
5558
D: ResourceProvider<DateSymbolsV1Marker>
5659
+ ResourceProvider<DatePatternsV1Marker>
60+
+ ResourceProvider<TimePatternsV1Marker>
5761
+ ResourceProvider<DateSkeletonPatternsV1Marker>
5862
+ ResourceProvider<DecimalSymbolsV1Marker>
5963
+ ResourceProvider<OrdinalV1Marker>

components/datetime/src/raw/zoned_datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ use crate::{
2222
pattern::runtime::PatternPlurals,
2323
provider::{
2424
self,
25-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
25+
calendar::{
26+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
27+
TimePatternsV1Marker,
28+
},
2629
week_data::WeekDataV1Marker,
2730
},
2831
raw,
@@ -56,6 +59,7 @@ impl ZonedDateTimeFormat {
5659
where
5760
DP: ResourceProvider<DateSymbolsV1Marker>
5861
+ ResourceProvider<DatePatternsV1Marker>
62+
+ ResourceProvider<TimePatternsV1Marker>
5963
+ ResourceProvider<DateSkeletonPatternsV1Marker>
6064
+ ResourceProvider<WeekDataV1Marker>
6165
+ ?Sized,

components/datetime/src/zoned_datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use crate::{
1515
options::DateTimeFormatOptions,
1616
provider::{
1717
self,
18-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
18+
calendar::{
19+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
20+
TimePatternsV1Marker,
21+
},
1922
week_data::WeekDataV1Marker,
2023
},
2124
raw,
@@ -121,6 +124,7 @@ impl<C: CldrCalendar> ZonedDateTimeFormat<C> {
121124
L: Into<Locale>,
122125
DP: ResourceProvider<DateSymbolsV1Marker>
123126
+ ResourceProvider<DatePatternsV1Marker>
127+
+ ResourceProvider<TimePatternsV1Marker>
124128
+ ResourceProvider<DateSkeletonPatternsV1Marker>
125129
+ ResourceProvider<WeekDataV1Marker>
126130
+ ?Sized,

components/datetime/tests/datetime.rs

+40-9
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ use icu_datetime::{
1616
mock::{parse_gregorian_from_str, zoned_datetime::MockZonedDateTime},
1717
pattern::runtime,
1818
provider::{
19-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
19+
calendar::{
20+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
21+
TimePatternsV1Marker,
22+
},
2023
week_data::WeekDataV1Marker,
2124
},
2225
time_zone::{TimeZoneFormat, TimeZoneFormatOptions},
@@ -145,6 +148,7 @@ fn assert_fixture_element<A, D>(
145148
A::Calendar: CldrCalendar,
146149
D: ResourceProvider<DateSymbolsV1Marker>
147150
+ ResourceProvider<DatePatternsV1Marker>
151+
+ ResourceProvider<TimePatternsV1Marker>
148152
+ ResourceProvider<DateSkeletonPatternsV1Marker>
149153
+ ResourceProvider<DecimalSymbolsV1Marker>
150154
+ ResourceProvider<OrdinalV1Marker>
@@ -234,15 +238,26 @@ fn test_dayperiod_patterns() {
234238
.unicode
235239
.keywords
236240
.set(unicode_ext_key!("ca"), unicode_ext_value!("gregory"));
237-
let mut patterns_data: DataPayload<DatePatternsV1Marker> = provider
241+
let mut date_patterns_data: DataPayload<DatePatternsV1Marker> = provider
238242
.load_resource(&DataRequest {
239243
options: ResourceOptions::from(&locale),
240244
metadata: Default::default(),
241245
})
242246
.unwrap()
243247
.take_payload()
244248
.unwrap();
245-
patterns_data.with_mut(|data| {
249+
date_patterns_data.with_mut(|data| {
250+
data.length_combinations.long = "{0}".parse().unwrap();
251+
});
252+
let mut time_patterns_data: DataPayload<TimePatternsV1Marker> = provider
253+
.load_resource(&DataRequest {
254+
options: ResourceOptions::from(&locale),
255+
metadata: Default::default(),
256+
})
257+
.unwrap()
258+
.take_payload()
259+
.unwrap();
260+
date_patterns_data.with_mut(|data| {
246261
data.length_combinations.long = "{0}".parse().unwrap();
247262
});
248263
let symbols_data: DataPayload<DateSymbolsV1Marker> = provider
@@ -284,7 +299,7 @@ fn test_dayperiod_patterns() {
284299
for pattern_input in patterns {
285300
let new_pattern1: runtime::Pattern = pattern_input.parse().unwrap();
286301
let new_pattern2: runtime::Pattern = pattern_input.parse().unwrap();
287-
patterns_data.with_mut(move |data| {
302+
time_patterns_data.with_mut(move |data| {
288303
data.time_h11_h12.long = new_pattern1;
289304
data.time_h23_h24.long = new_pattern2;
290305
});
@@ -300,7 +315,11 @@ fn test_dayperiod_patterns() {
300315
},
301316
AnyPayloadProvider {
302317
key: DatePatternsV1Marker::KEY,
303-
data: patterns_data.clone().wrap_into_any_payload(),
318+
data: date_patterns_data.clone().wrap_into_any_payload(),
319+
},
320+
AnyPayloadProvider {
321+
key: TimePatternsV1Marker::KEY,
322+
data: time_patterns_data.clone().wrap_into_any_payload(),
304323
},
305324
AnyPayloadProvider {
306325
key: WeekDataV1Marker::KEY,
@@ -406,7 +425,15 @@ fn test_time_zone_patterns() {
406425
datetime.time_zone.metazone_id = config.metazone_id.take().map(MetaZoneId);
407426
datetime.time_zone.time_variant = config.time_variant.take();
408427

409-
let mut patterns_data: DataPayload<DatePatternsV1Marker> = date_provider
428+
let mut date_patterns_data: DataPayload<DatePatternsV1Marker> = date_provider
429+
.load_resource(&DataRequest {
430+
options: ResourceOptions::from(&locale),
431+
metadata: Default::default(),
432+
})
433+
.unwrap()
434+
.take_payload()
435+
.unwrap();
436+
let mut time_patterns_data: DataPayload<TimePatternsV1Marker> = date_provider
410437
.load_resource(&DataRequest {
411438
options: ResourceOptions::from(&locale),
412439
metadata: Default::default(),
@@ -439,7 +466,7 @@ fn test_time_zone_patterns() {
439466
.take_payload()
440467
.unwrap();
441468

442-
patterns_data.with_mut(|data| {
469+
date_patterns_data.with_mut(|data| {
443470
data.length_combinations.long = "{0}".parse().unwrap();
444471
});
445472

@@ -453,7 +480,7 @@ fn test_time_zone_patterns() {
453480
for pattern_input in patterns {
454481
let new_pattern1: runtime::Pattern = pattern_input.parse().unwrap();
455482
let new_pattern2: runtime::Pattern = pattern_input.parse().unwrap();
456-
patterns_data.with_mut(move |data| {
483+
time_patterns_data.with_mut(move |data| {
457484
data.time_h11_h12.long = new_pattern1;
458485
data.time_h23_h24.long = new_pattern2;
459486
});
@@ -469,7 +496,11 @@ fn test_time_zone_patterns() {
469496
},
470497
AnyPayloadProvider {
471498
key: DatePatternsV1Marker::KEY,
472-
data: patterns_data.clone().wrap_into_any_payload(),
499+
data: date_patterns_data.clone().wrap_into_any_payload(),
500+
},
501+
AnyPayloadProvider {
502+
key: TimePatternsV1Marker::KEY,
503+
data: time_patterns_data.clone().wrap_into_any_payload(),
473504
},
474505
AnyPayloadProvider {
475506
key: WeekDataV1Marker::KEY,

0 commit comments

Comments
 (0)