Skip to content

Commit a42ede5

Browse files
authored
Properly sort enum cases based on their current name, instead of the name it would after current transliteration (Enum keys never change for BC) (#282)
1 parent 9dc62cf commit a42ede5

File tree

8 files changed

+39
-21
lines changed

8 files changed

+39
-21
lines changed

dev/DataSource/Sorting/KeySorting.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,27 @@
33

44
namespace PrinsFrank\Standards\Dev\DataSource\Sorting;
55

6+
use BackedEnum;
67
use PrinsFrank\Standards\Dev\DataTarget\EnumCase;
7-
use PrinsFrank\Standards\Dev\DataTarget\NameNormalizer;
88
use PrinsFrank\Standards\Dev\Exception\TransliterationException;
99
use PrinsFrank\Transliteration\Exception\InvalidArgumentException;
1010
use PrinsFrank\Transliteration\Exception\RecursionException;
1111
use PrinsFrank\Transliteration\Exception\UnableToCreateTransliteratorException;
1212

1313
class KeySorting implements Sorting {
14+
/** @param class-string<BackedEnum> $enumFQN */
15+
public function __construct(
16+
private readonly string $enumFQN,
17+
) {
18+
}
19+
1420
/**
1521
* @throws InvalidArgumentException
1622
* @throws UnableToCreateTransliteratorException
1723
* @throws TransliterationException
1824
* @throws RecursionException
1925
*/
2026
public function __invoke(EnumCase $a, EnumCase $b): int {
21-
return ($a->deprecated ? 1 : 0) . NameNormalizer::normalize($a->name) <=> ($b->deprecated ? 1 : 0) . NameNormalizer::normalize($b->name);
27+
return ($a->deprecated ? 1 : 0) . $a->getKey($this->enumFQN) <=> ($b->deprecated ? 1 : 0) . $b->getKey($this->enumFQN);
2228
}
2329
}

dev/DataTarget/EnumCase.php

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,27 @@ public function __construct(
2222
) {
2323
}
2424

25+
/**
26+
* @param class-string<BackedEnum> $enumFQN
27+
* @throws TransliterationException
28+
* @throws UnableToCreateTransliteratorException
29+
* @throws RecursionException
30+
* @throws \PrinsFrank\Transliteration\Exception\InvalidArgumentException
31+
* @return string an existing name if the case already existed, otherwise the new name
32+
*/
33+
public function getKey(string $enumFQN): string {
34+
$existingKeyWithValue = $enumFQN::tryFrom($this->value) ?? ($this->previousValue !== null ? $enumFQN::tryFrom($this->previousValue) : null);
35+
$key = $existingKeyWithValue !== null ? $existingKeyWithValue->name : NameNormalizer::normalize($this->name);
36+
if ($existingKeyWithValue === null && is_string($this->value)) {
37+
$mostCommonScriptInString = ScriptAlias::mostCommonInString($this->value) ?? ScriptAlias::Code_for_undetermined_script;
38+
if (in_array($mostCommonScriptInString, [ScriptAlias::Code_for_undetermined_script, ScriptAlias::Latin], true) !== true) {
39+
$key .= '_' . mb_strtolower($mostCommonScriptInString->value);
40+
}
41+
}
42+
43+
return $key;
44+
}
45+
2546
/**
2647
* @param class-string<BackedEnum> $enumFQN
2748
* @throws InvalidArgumentException
@@ -44,15 +65,7 @@ public function toString(string $enumFQN, string $indenting, bool $isFirst): str
4465
$case .= PHP_EOL . $indenting . $attribute->__toString();
4566
}
4667

47-
$existingKeyWithValue = $enumFQN::tryFrom($this->value) ?? ($this->previousValue !== null ? $enumFQN::tryFrom($this->previousValue) : null);
48-
$key = $existingKeyWithValue !== null ? $existingKeyWithValue->name : NameNormalizer::normalize($this->name);
49-
if ($existingKeyWithValue === null && is_string($this->value)) {
50-
$mostCommonScriptInString = ScriptAlias::mostCommonInString($this->value) ?? ScriptAlias::Code_for_undetermined_script;
51-
if (in_array($mostCommonScriptInString, [ScriptAlias::Code_for_undetermined_script, ScriptAlias::Latin], true) !== true) {
52-
$key .= '_' . mb_strtolower($mostCommonScriptInString->value);
53-
}
54-
}
55-
68+
$key = $this->getKey($enumFQN);
5669
if (is_int($this->value)) {
5770
$case .= PHP_EOL . $indenting . 'case ' . $key . ' = ' . $this->value . ';';
5871
} else {

dev/DataTarget/SpecFile.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use PrinsFrank\Standards\Dev\Exception\EnumNotFoundException;
1010
use PrinsFrank\Standards\Dev\Exception\TransliterationException;
1111
use PrinsFrank\Standards\InvalidArgumentException;
12-
use PrinsFrank\Standards\Scripts\ScriptAlias;
1312
use PrinsFrank\Transliteration\Exception\RecursionException;
1413
use PrinsFrank\Transliteration\Exception\UnableToCreateTransliteratorException;
1514
use RuntimeException;
@@ -111,11 +110,11 @@ public function writeCases(): self {
111110
$newEnumContent = mb_substr($enumContent, 0, $startEnum + 1);
112111
$keyedCases = [];
113112
foreach ($this->cases as $case) {
114-
$keyedCases[$case->name . (is_string($case->value) ? ScriptAlias::mostCommonInString($case->value)->value ?? '' : '') . $case->value] = $case;
113+
$keyedCases[$case->getKey($this->FQN) . $case->value] = $case;
115114
}
116115

117116
$deduplicatedCases = array_values($keyedCases);
118-
usort($deduplicatedCases, new $this->sortingFQN());
117+
usort($deduplicatedCases, new $this->sortingFQN($this->FQN));
119118
foreach ($deduplicatedCases as $key => $case) {
120119
$newEnumContent .= $case->toString($this->FQN, ' ', $key === 0);
121120
}

src/Language/LanguageAlpha3Bibliographic.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ enum LanguageAlpha3Bibliographic: string {
133133
case Dinka = 'din';
134134
case Divehi_Dhivehi_Maldivian = 'div';
135135
case Dogri = 'doi';
136+
case Dogrib = 'dgr';
136137
case Dravidian_languages = 'dra';
137138
case Duala = 'dua';
138139
case Dutch_Flemish = 'dut';
@@ -454,7 +455,6 @@ enum LanguageAlpha3Bibliographic: string {
454455
case Tigrinya = 'tir';
455456
case Timne = 'tem';
456457
case Tiv = 'tiv';
457-
case Dogrib = 'dgr';
458458
case Tlingit = 'tli';
459459
case Tok_Pisin = 'tpi';
460460
case Tokelau = 'tkl';

src/Language/LanguageAlpha3Terminology.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ enum LanguageAlpha3Terminology: string {
134134
case Dinka = 'din';
135135
case Divehi_Dhivehi_Maldivian = 'div';
136136
case Dogri = 'doi';
137+
case Dogrib = 'dgr';
137138
case Dravidian_languages = 'dra';
138139
case Duala = 'dua';
139140
case Dutch_Flemish = 'nld';
@@ -455,7 +456,6 @@ enum LanguageAlpha3Terminology: string {
455456
case Tigrinya = 'tir';
456457
case Timne = 'tem';
457458
case Tiv = 'tiv';
458-
case Dogrib = 'dgr';
459459
case Tlingit = 'tli';
460460
case Tok_Pisin = 'tpi';
461461
case Tokelau = 'tkl';

src/Language/LanguageName.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ enum LanguageName: string {
126126
case Dinka = 'Dinka';
127127
case Divehi_Dhivehi_Maldivian = 'Divehi; Dhivehi; Maldivian';
128128
case Dogri = 'Dogri';
129+
case Dogrib = 'Tlicho; Dogrib';
129130
case Dravidian_languages = 'Dravidian languages';
130131
case Duala = 'Duala';
131132
case Dutch_Flemish = 'Dutch; Flemish';
@@ -447,7 +448,6 @@ enum LanguageName: string {
447448
case Tigrinya = 'Tigrinya';
448449
case Timne = 'Timne';
449450
case Tiv = 'Tiv';
450-
case Dogrib = 'Tlicho; Dogrib';
451451
case Tlingit = 'Tlingit';
452452
case Tok_Pisin = 'Tok Pisin';
453453
case Tokelau = 'Tokelau';

src/TopLevelDomain/CountryCodeTLD.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ enum CountryCodeTLD: string implements TLD {
5757
case bg_cyrillic = 'бг';
5858
case bh = 'bh';
5959
case bharat_telugu = 'భారత్';
60-
case bharata_kannada = 'ಭಾರತ';
61-
case bharata_oriya = 'ଭାରତ';
6260
case bharata_bengali = 'ভাৰত';
6361
case bharata_bengali_2 = 'ভারত';
64-
case bharata_gujarati = 'ભારત';
6562
case bharata_devanagari = 'भारत';
63+
case bharata_gujarati = 'ભારત';
6664
case bharata_gurmukhi = 'ਭਾਰਤ';
65+
case bharata_kannada = 'ಭಾರತ';
66+
case bharata_oriya = 'ଭାରତ';
6767
case bharatam_devanagari = 'भारतम्';
6868
case bharatam_malayalam = 'ഭാരതം';
6969
case bharota_devanagari = 'भारोत';

src/TopLevelDomain/GenericTLD.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,8 +696,8 @@ enum GenericTLD: string implements TLD {
696696
case ji_gou_han = '机构';
697697
case ji_tuan_han = '集团';
698698
case jia_dian_han = '家電';
699-
case jia_li_han = '嘉里';
700699
case jia_li_da_jiu_dian_han = '嘉里大酒店';
700+
case jia_li_han = '嘉里';
701701
case jian_kang_han = '健康';
702702
case jio = 'jio';
703703

0 commit comments

Comments
 (0)