From 3cb38d3c564112b413a11e20eb5239906a044d49 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 3 Apr 2023 21:53:36 -0500 Subject: [PATCH] CLDR-16316 test: make it a warning if a currency code recently expired (#2828) --- .../unicode/cldr/test/CheckForExemplars.java | 3 +- .../unicode/cldr/test/ExampleGenerator.java | 9 ++--- .../unicode/cldr/tool/GenerateDayPeriods.java | 3 +- .../java/org/unicode/cldr/util/CLDRURLS.java | 2 + .../org/unicode/cldr/util/DateConstants.java | 23 +++++++++++ .../org/unicode/cldr/util/DayPeriodInfo.java | 8 ++-- .../cldr/unittest/TestSupplementalInfo.java | 38 ++++++++++++++----- 7 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 tools/cldr-code/src/main/java/org/unicode/cldr/util/DateConstants.java diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/test/CheckForExemplars.java b/tools/cldr-code/src/main/java/org/unicode/cldr/test/CheckForExemplars.java index 2b09604fd08..92469e70559 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/test/CheckForExemplars.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/test/CheckForExemplars.java @@ -20,6 +20,7 @@ import org.unicode.cldr.test.CheckCLDR.CheckStatus.Subtype; import org.unicode.cldr.util.CLDRConfig; import org.unicode.cldr.util.CLDRFile; +import org.unicode.cldr.util.DateConstants; import org.unicode.cldr.util.CLDRFile.Status; import org.unicode.cldr.util.Factory; import org.unicode.cldr.util.InternalCldrException; @@ -625,7 +626,7 @@ private Set getCurrenciesForScript(String script) { } // For each territory, get all of its legal tender currencies. - Date now = new Date(System.currentTimeMillis()); + Date now = DateConstants.NOW; scriptToCurrencies = new Relation(new HashMap>(), HashSet.class); for (Object curScript : scriptToTerritories.keySet()) { Set territories = scriptToTerritories.get(curScript); diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java b/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java index bfc03954db3..a5cb194f6c7 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java @@ -25,6 +25,7 @@ import org.unicode.cldr.util.CLDRFile; import org.unicode.cldr.util.CLDRLocale; import org.unicode.cldr.util.CldrUtility; +import org.unicode.cldr.util.DateConstants; import org.unicode.cldr.util.DayPeriodInfo; import org.unicode.cldr.util.DayPeriodInfo.DayPeriod; import org.unicode.cldr.util.EmojiConstants; @@ -1844,12 +1845,10 @@ private String handleTimeZoneName(XPathParts parts, String value) { if (parts.contains("daylight")) { tzOffset += currentZone.getDSTSavings(); } - int MILLIS_PER_MINUTE = 1000 * 60; - int MILLIS_PER_HOUR = MILLIS_PER_MINUTE * 60; - int tm_hrs = tzOffset / MILLIS_PER_HOUR; - int tm_mins = (tzOffset % MILLIS_PER_HOUR) / 60000; // millis per minute + long tm_hrs = tzOffset / DateConstants.MILLIS_PER_HOUR; + long tm_mins = (tzOffset % DateConstants.MILLIS_PER_HOUR) / DateConstants.MILLIS_PER_MINUTE; result = setBackground(getMZTimeFormat() + " " - + getGMTFormat(hourFormat, gmtFormat, tm_hrs, tm_mins)); + + getGMTFormat(hourFormat, gmtFormat, (int)tm_hrs, (int)tm_mins)); } } } diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/tool/GenerateDayPeriods.java b/tools/cldr-code/src/main/java/org/unicode/cldr/tool/GenerateDayPeriods.java index 801348c82db..5bb2f191f45 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/tool/GenerateDayPeriods.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/tool/GenerateDayPeriods.java @@ -11,6 +11,7 @@ import org.unicode.cldr.util.CLDRConfig; import org.unicode.cldr.util.CLDRFile; import org.unicode.cldr.util.CLDRPaths; +import org.unicode.cldr.util.DateConstants; import org.unicode.cldr.util.DayPeriodInfo; import org.unicode.cldr.util.DayPeriodInfo.DayPeriod; import org.unicode.cldr.util.DayPeriodInfo.Span; @@ -20,10 +21,10 @@ import org.unicode.cldr.util.SupplementalDataInfo; import org.unicode.cldr.util.With; import org.unicode.cldr.util.XPathParts; +import static org.unicode.cldr.util.DateConstants.MILLIS_PER_DAY; public class GenerateDayPeriods { static final SupplementalDataInfo SDI = SupplementalDataInfo.getInstance(); - private static final int MILLIS_PER_DAY = 24 * 60 * 60 * 1000; public static void main(String[] args) throws IOException { try (PrintWriter out = FileUtilities.openUTF8Writer(CLDRPaths.GEN_DIRECTORY + "/supplemental", "dayPeriods.xml")) { diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/CLDRURLS.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/CLDRURLS.java index 928f08b0e50..236a75babc9 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/util/CLDRURLS.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/CLDRURLS.java @@ -137,6 +137,8 @@ public enum Special { public static final String PRIORITY_SUMMARY_HELP_URL = "https://cldr.unicode.org/translation/getting-started/vetting-view#TOC-Priority-Items"; + public static final String UPDATING_CURRENCY_CODES = "https://cldr.unicode.org/development/updating-codes/update-currency-codes"; + /** * Get the relative base URL for the SurveyTool. * This may be "/cldr-apps", for example. diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/DateConstants.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/DateConstants.java new file mode 100644 index 00000000000..c7222a7b8b2 --- /dev/null +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/DateConstants.java @@ -0,0 +1,23 @@ +package org.unicode.cldr.util; + +import java.util.Date; + +/** + * Some date related constants + */ +public class DateConstants { + /** + * Right now. A single constant so that it is consistent across callers. + */ + public static final Date NOW = new Date(); + public static final long MILLIS_PER_SECOND = 60 * 1000; + public static final long MILLIS_PER_MINUTE = MILLIS_PER_SECOND * 60; + public static final long MILLIS_PER_HOUR = MILLIS_PER_MINUTE * 60; + public static final long MILLIS_PER_DAY = MILLIS_PER_HOUR * 24; + public static final long MILLIS_PER_MONTH = MILLIS_PER_DAY * 30; + + /** + * A date a little less than 8 months ago. + */ + public static final Date RECENT_HISTORY = new Date(NOW.getTime() - (MILLIS_PER_MONTH * 8)); +} diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/DayPeriodInfo.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/DayPeriodInfo.java index 401bbcc78eb..6b98fa11164 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/util/DayPeriodInfo.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/DayPeriodInfo.java @@ -351,9 +351,9 @@ public String toString(DayPeriod dayPeriod) { return result.toString(); } - public static String formatTime(int time) { - int minutes = time / (60 * 1000); - int hours = minutes / 60; + public static String formatTime(long time) { + long minutes = time / (60 * 1000); + long hours = minutes / 60; minutes -= hours * 60; return String.format("%02d:%02d", hours, minutes); } @@ -486,4 +486,4 @@ private boolean collisionIsErrorSelection(DayPeriod dayPeriod, Span other, Outpu } return false; } -} \ No newline at end of file +} diff --git a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestSupplementalInfo.java b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestSupplementalInfo.java index c5a35cf3310..50428d652b9 100644 --- a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestSupplementalInfo.java +++ b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestSupplementalInfo.java @@ -22,6 +22,7 @@ import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.unicode.cldr.draft.ScriptMetadata; import org.unicode.cldr.test.CoverageLevel2; @@ -1333,8 +1334,6 @@ public void TestCompleteness() { private static final Date LIMIT_FOR_NEW_CURRENCY = new Date( new Date().getYear() - 5, 1, 1); - private static final Date NOW = new Date(); - private Matcher oldMatcher = Pattern.compile( "\\bold\\b|\\([0-9]{4}-[0-9]{4}\\)", Pattern.CASE_INSENSITIVE) .matcher(""); @@ -1347,7 +1346,7 @@ public void TestCompleteness() { * * @param args */ - public void TestCurrency() { + public void TestSupplementalCurrency() { IsoCurrencyParser isoCodes = IsoCurrencyParser.getInstance(); Set currencyCodes = STANDARD_CODES .getGoodAvailableCodes("currency"); @@ -1357,6 +1356,9 @@ public void TestCurrency() { Relation> modernCurrencyCodes = Relation .of(new TreeMap>>(), TreeSet.class); + Relation> recentModernCurrencyCodes = Relation + .of(new TreeMap>>(), + TreeSet.class); Set territoriesWithoutModernCurrencies = new TreeSet<>( STANDARD_CODES.getGoodAvailableCodes("territory")); Map currencyFirstValid = new TreeMap<>(); @@ -1393,9 +1395,7 @@ public void TestCurrency() { if (lastValue == null || lastValue.compareTo(end) > 0) { currencyLastValid.put(currency, end); } - if (start.compareTo(NOW) < 0 && end.compareTo(NOW) >= 0) { // Non-tender - // is - // OK... + if (start.compareTo(DateConstants.NOW) < 0 && end.compareTo(DateConstants.NOW) >= 0) { // Non-tender is OK... modernCurrencyCodes.put(currency, new Pair<>(territory, dateInfo)); @@ -1404,6 +1404,12 @@ public void TestCurrency() { nonModernCurrencyCodes.put(currency, new Pair<>(territory, dateInfo)); + if (start.compareTo(DateConstants.NOW) < 0 && end.compareTo(DateConstants.RECENT_HISTORY) >= 0) { + // It was CLDR tender recently. + recentModernCurrencyCodes.put(currency, + new Pair<>(territory, + dateInfo)); + } } logln(territory + "\t" @@ -1424,10 +1430,18 @@ public void TestCurrency() { Set missing = new TreeSet<>( isoCurrenciesToCountries.keySet()); missing.removeAll(modernCurrencyCodes.keySet()); + Set recentMissing = new TreeSet<>(missing); + recentMissing.retainAll(recentModernCurrencyCodes.keySet()); + if (recentMissing.size() != 0) { + warnln("WARNING: Codes in ISO 4217 and until-recently legal tender in CLDR. " + + "(may need to update " + CLDRURLS.UPDATING_CURRENCY_CODES + " ): " + + currencyDateRelationToString(recentModernCurrencyCodes, recentMissing)); + missing.removeAll(recentMissing); // not errors + } if (missing.size() != 0) { errln("Codes in ISO 4217 but not current tender in CLDR " + - "(may need to update https://cldr.unicode.org/development/updating-codes/update-currency-codes ): " + - missing.toString()); + "(may need to update " + CLDRURLS.UPDATING_CURRENCY_CODES + " ): " + + currencyDateRelationToString(nonModernCurrencyCodes, missing)); } for (String currency : modernCurrencyCodes.keySet()) { @@ -1512,7 +1526,7 @@ public void TestCurrency() { Set currencyInfo = SUPPLEMENTAL .getCurrencyDateInfo(territory); for (CurrencyDateInfo dateInfo : currencyInfo) { - if (dateInfo.getEnd().compareTo(NOW) < 0) { + if (dateInfo.getEnd().compareTo(DateConstants.NOW) < 0) { continue; } logln("\tCurrencies used instead: " @@ -1540,6 +1554,12 @@ public void TestCurrency() { } } + private String currencyDateRelationToString(Relation> allCodes, Set filter) { + return allCodes.entrySet().stream().filter(p -> filter.contains(p.getKey())) + .map(p -> p.getValue().getSecond().toString()) + .collect(Collectors.joining(", ")); + } + private void showCountries(final String title, Set isoCountries, Set cldrCountries, Set missing) { missing.clear();