diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8280ea0..f4ad547 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,6 +25,14 @@ jobs: - name: 'Checkout Code' uses: actions/checkout@v2 + - name: 'Setup PHP' + uses: shivammathur/setup-php@v2 + with: + php-version: 8.1 + ini-values: memory_limit=-1 + coverage: none + tools: composer:v2 + - name: 'Install Dependencies' run: composer install --prefer-dist --no-progress --no-interaction @@ -41,7 +49,7 @@ jobs: - name: 'Setup PHP' uses: shivammathur/setup-php@v2 with: - php-version: 8.0 + php-version: 8.1 ini-values: memory_limit=-1 coverage: none tools: composer:v2 @@ -66,7 +74,7 @@ jobs: - name: 'Setup PHP' uses: shivammathur/setup-php@v2 with: - php-version: 8.0 + php-version: 8.1 ini-values: memory_limit=-1 coverage: none tools: composer:v2 @@ -86,10 +94,7 @@ jobs: fail-fast: false matrix: php-version: - - '7.2' - - '7.3' - - '7.4' - - '8.0' + - '8.1' steps: - name: 'Checkout Code' uses: actions/checkout@v2 @@ -122,7 +127,7 @@ jobs: - name: 'Setup PHP' uses: shivammathur/setup-php@v2 with: - php-version: 7.4 + php-version: 8.1 ini-values: memory_limit=-1 coverage: pcov tools: composer:v2 diff --git a/.styleci.yml b/.styleci.yml index 742c956..1c5ec6e 100644 --- a/.styleci.yml +++ b/.styleci.yml @@ -1,17 +1,19 @@ preset: recommended +version: 8.1 + enabled: - - combine_consecutive_unsets - - linebreak_after_opening_tag - - ordered_class_elements - - unalign_double_arrow + - combine_consecutive_unsets + - linebreak_after_opening_tag + - ordered_class_elements + - unalign_double_arrow disabled: - - align_double_arrow + - align_double_arrow finder: - exclude: - - "tests" - - "*Test.php" - name: - - "*.php" + exclude: + - "tests" + - "*Test.php" + name: + - "*.php" diff --git a/README.md b/README.md index 3b0f48d..c87cb9d 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,11 @@ PHP library for transliteration. 🇺🇦 🇬🇧 🇷🇺 🔡 🐘 ## Requirements 🧐 -* PHP 7.2 *and later* +* PHP >= 8.1 ## Installation 🌱 -```composer req fresh/transliteration='~2.1'``` +```composer req fresh/transliteration='~3.0'``` ## Available transliteration methods 🎁 diff --git a/composer.json b/composer.json index 8281ade..a080ad6 100644 --- a/composer.json +++ b/composer.json @@ -17,16 +17,16 @@ "issues": "https://github.com/fre5h/transliteration/issues" }, "require": { - "php": ">=7.2" + "php": ">=8.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.18", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "~8.5", - "slam/phpstan-extensions": "^5.0.2", - "squizlabs/php_codesniffer": "~3.5", - "thecodingmachine/phpstan-strict-rules": "^0.12" + "friendsofphp/php-cs-fixer": "^3.3", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.5", + "slam/phpstan-extensions": "^6.0", + "squizlabs/php_codesniffer": "^3.6", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "autoload": { "psr-4": { diff --git a/phpstan.neon b/phpstan.neon index cf82063..af28c27 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,9 +3,10 @@ includes: - 'vendor/phpstan/phpstan-phpunit/rules.neon' - 'vendor/slam/phpstan-extensions/conf/slam-rules.neon' parameters: - level: 8 - excludes_analyse: + level: 9 + excludePaths: - '%rootDir%/../../../tests/*' - '%rootDir%/../../../vendor/*' fileExtensions: - 'php' + checkMissingIterableValueType: false diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c757612..b37d7a0 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,7 +1,7 @@ @@ -11,9 +11,9 @@ - - - ./src/ - - + + + ./src/ + + diff --git a/src/RussianToEnglish.php b/src/RussianToEnglish.php index 2c7593c..e878244 100644 --- a/src/RussianToEnglish.php +++ b/src/RussianToEnglish.php @@ -23,7 +23,7 @@ */ class RussianToEnglish implements TransliteratorInterface { - /** @const string[] */ + /** @const array */ private const RUSSIAN_TO_ENGLISH_RULES = [ 'а' => 'a', 'б' => 'b', diff --git a/src/UkrainianToEnglish.php b/src/UkrainianToEnglish.php index 5c0001c..703e656 100644 --- a/src/UkrainianToEnglish.php +++ b/src/UkrainianToEnglish.php @@ -24,7 +24,7 @@ */ class UkrainianToEnglish implements TransliteratorInterface { - /** @const string[] */ + /** @const array */ private const UKRAINIAN_TO_ENGLISH_RULES = [ 'А' => 'A', 'Б' => 'B', diff --git a/tests/RussianToEnglishTest.php b/tests/RussianToEnglishTest.php index 5d7c6fd..733ed4b 100644 --- a/tests/RussianToEnglishTest.php +++ b/tests/RussianToEnglishTest.php @@ -24,8 +24,7 @@ */ class RussianToEnglishTest extends TestCase { - /** @var Transliterator */ - protected $transliterator; + protected Transliterator $transliterator; protected function setUp(): void { @@ -40,74 +39,72 @@ public function testTransliterationFromRussianToEnglish(string $russianText, str self::assertEquals($transliteratedText, $this->transliterator->ruToEn($russianText)); } - public function alphabetProvider(): array + public function alphabetProvider(): iterable { - return [ - ['а', 'a'], - ['б', 'b'], - ['в', 'v'], - ['г', 'g'], - ['д', 'd'], - ['е', 'e'], - ['ё', 'e'], - ['ж', 'zh'], - ['з', 'z'], - ['и', 'i'], - ['й', 'y'], - ['к', 'k'], - ['л', 'l'], - ['м', 'm'], - ['н', 'n'], - ['о', 'o'], - ['п', 'p'], - ['р', 'r'], - ['с', 's'], - ['т', 't'], - ['у', 'u'], - ['ф', 'f'], - ['х', 'h'], - ['ц', 'ts'], - ['ч', 'ch'], - ['ш', 'sh'], - ['щ', 'sht'], - ['ь', ''], - ['ы', 'y'], - ['ъ', ''], - ['э', 'e'], - ['ю', 'yu'], - ['я', 'ya'], - ['А', 'A'], - ['Б', 'B'], - ['В', 'V'], - ['Г', 'G'], - ['Д', 'D'], - ['Е', 'E'], - ['Ж', 'Zh'], - ['З', 'Z'], - ['И', 'I'], - ['Й', 'Y'], - ['К', 'K'], - ['Л', 'L'], - ['М', 'M'], - ['Н', 'N'], - ['О', 'O'], - ['П', 'P'], - ['Р', 'R'], - ['С', 'S'], - ['Т', 'T'], - ['У', 'U'], - ['Ф', 'F'], - ['Х', 'H'], - ['Ц', 'Ts'], - ['Ч', 'Ch'], - ['Ш', 'Sh'], - ['Щ', 'Sht'], - ['Ь', ''], - ['Ы', 'Y'], - ['Ъ', ''], - ['Э', 'E'], - ['Ю', 'Yu'], - ['Я', 'Ya'], - ]; + yield ['А', 'A']; + yield ['Б', 'B']; + yield ['В', 'V']; + yield ['Г', 'G']; + yield ['Д', 'D']; + yield ['Е', 'E']; + yield ['Ж', 'Zh']; + yield ['З', 'Z']; + yield ['И', 'I']; + yield ['Й', 'Y']; + yield ['К', 'K']; + yield ['Л', 'L']; + yield ['М', 'M']; + yield ['Н', 'N']; + yield ['О', 'O']; + yield ['П', 'P']; + yield ['Р', 'R']; + yield ['С', 'S']; + yield ['Т', 'T']; + yield ['У', 'U']; + yield ['Ф', 'F']; + yield ['Х', 'H']; + yield ['Ц', 'Ts']; + yield ['Ч', 'Ch']; + yield ['Ш', 'Sh']; + yield ['Щ', 'Sht']; + yield ['Ь', '']; + yield ['Ы', 'Y']; + yield ['Ъ', '']; + yield ['Э', 'E']; + yield ['Ю', 'Yu']; + yield ['Я', 'Ya']; + yield ['а', 'a']; + yield ['б', 'b']; + yield ['в', 'v']; + yield ['г', 'g']; + yield ['д', 'd']; + yield ['е', 'e']; + yield ['ё', 'e']; + yield ['ж', 'zh']; + yield ['з', 'z']; + yield ['и', 'i']; + yield ['й', 'y']; + yield ['к', 'k']; + yield ['л', 'l']; + yield ['м', 'm']; + yield ['н', 'n']; + yield ['о', 'o']; + yield ['п', 'p']; + yield ['р', 'r']; + yield ['с', 's']; + yield ['т', 't']; + yield ['у', 'u']; + yield ['ф', 'f']; + yield ['х', 'h']; + yield ['ц', 'ts']; + yield ['ч', 'ch']; + yield ['ш', 'sh']; + yield ['щ', 'sht']; + yield ['ь', '']; + yield ['ы', 'y']; + yield ['ъ', '']; + yield ['э', 'e']; + yield ['ю', 'yu']; + yield ['я', 'ya']; } } diff --git a/tests/UkrainianToEnglishTest.php b/tests/UkrainianToEnglishTest.php index 0d478ed..98222cf 100644 --- a/tests/UkrainianToEnglishTest.php +++ b/tests/UkrainianToEnglishTest.php @@ -22,8 +22,7 @@ */ class UkrainianToEnglishTest extends TestCase { - /** @var Transliterator */ - protected $transliterator; + protected Transliterator $transliterator; protected function setUp(): void { @@ -40,199 +39,193 @@ public function testTransliterationFromUkrainianToEnglish(string $ukrainianText, $this->assertEquals($transliteratedText, $this->transliterator->ukToEn($ukrainianText)); } - public function alphabetProvider(): array + public function alphabetProvider(): iterable { - return [ - ['А', 'A'], - ['Б', 'B'], - ['В', 'V'], - ['Г', 'H'], - ['Ґ', 'G'], - ['Д', 'D'], - ['Е', 'E'], - ['Є', 'Ye'], - ['Ж', 'Zh'], - ['З', 'Z'], - ['И', 'Y'], - ['І', 'I'], - ['Ї', 'Yi'], - ['Й', 'Y'], - ['К', 'K'], - ['Л', 'L'], - ['М', 'M'], - ['Н', 'N'], - ['О', 'O'], - ['П', 'P'], - ['Р', 'R'], - ['С', 'S'], - ['Т', 'T'], - ['У', 'U'], - ['Ф', 'F'], - ['Х', 'Kh'], - ['Ц', 'Ts'], - ['Ч', 'Ch'], - ['Ш', 'Sh'], - ['Щ', 'Shch'], - ['Ю', 'Yu'], - ['Я', 'Ya'], - ['а', 'a'], - ['б', 'b'], - ['в', 'v'], - ['г', 'h'], - ['ґ', 'g'], - ['д', 'd'], - ['е', 'e'], - ['є', 'ie'], - ['ж', 'zh'], - ['з', 'z'], - ['и', 'y'], - ['і', 'i'], - ['ї', 'i'], - ['й', 'i'], - ['к', 'k'], - ['л', 'l'], - ['м', 'm'], - ['н', 'n'], - ['о', 'o'], - ['п', 'p'], - ['р', 'r'], - ['с', 's'], - ['т', 't'], - ['у', 'u'], - ['ф', 'f'], - ['х', 'kh'], - ['ц', 'ts'], - ['ч', 'ch'], - ['ш', 'sh'], - ['щ', 'shch'], - ['ь', ''], - ['ю', 'iu'], - ['я', 'ia'], - ['\'', ''], - ]; + yield ['А', 'A']; + yield ['Б', 'B']; + yield ['В', 'V']; + yield ['Г', 'H']; + yield ['Ґ', 'G']; + yield ['Д', 'D']; + yield ['Е', 'E']; + yield ['Є', 'Ye']; + yield ['Ж', 'Zh']; + yield ['З', 'Z']; + yield ['И', 'Y']; + yield ['І', 'I']; + yield ['Ї', 'Yi']; + yield ['Й', 'Y']; + yield ['К', 'K']; + yield ['Л', 'L']; + yield ['М', 'M']; + yield ['Н', 'N']; + yield ['О', 'O']; + yield ['П', 'P']; + yield ['Р', 'R']; + yield ['С', 'S']; + yield ['Т', 'T']; + yield ['У', 'U']; + yield ['Ф', 'F']; + yield ['Х', 'Kh']; + yield ['Ц', 'Ts']; + yield ['Ч', 'Ch']; + yield ['Ш', 'Sh']; + yield ['Щ', 'Shch']; + yield ['Ю', 'Yu']; + yield ['Я', 'Ya']; + yield ['а', 'a']; + yield ['б', 'b']; + yield ['в', 'v']; + yield ['г', 'h']; + yield ['ґ', 'g']; + yield ['д', 'd']; + yield ['е', 'e']; + yield ['є', 'ie']; + yield ['ж', 'zh']; + yield ['з', 'z']; + yield ['и', 'y']; + yield ['і', 'i']; + yield ['ї', 'i']; + yield ['й', 'i']; + yield ['к', 'k']; + yield ['л', 'l']; + yield ['м', 'm']; + yield ['н', 'n']; + yield ['о', 'o']; + yield ['п', 'p']; + yield ['р', 'r']; + yield ['с', 's']; + yield ['т', 't']; + yield ['у', 'u']; + yield ['ф', 'f']; + yield ['х', 'kh']; + yield ['ц', 'ts']; + yield ['ч', 'ch']; + yield ['ш', 'sh']; + yield ['щ', 'shch']; + yield ['ь', '']; + yield ['ю', 'iu']; + yield ['я', 'ia']; + yield ['\'', '']; } - public function officialExamplesProvider(): array + public function officialExamplesProvider(): iterable { // Examples of transliteration form the resolution of the Cabinet of Ministers of Ukraine №55 (27.01.2010) - return [ - // Аа - ['Алушта', 'Alushta'], - ['Андрій', 'Andrii'], - // Бб - ['Борщагівка', 'Borshchahivka'], - ['Борисенко', 'Borysenko'], - // Вв - ['Вінниця', 'Vinnytsia'], - ['Володимир', 'Volodymyr'], - // Гг - ['Гадяч', 'Hadiach'], - ['Богдан', 'Bohdan'], - ['Згурський', 'Zghurskyi'], - // Ґґ - ['Ґалаґан', 'Galagan'], - ['Ґорґани', 'Gorgany'], - // Дд - ['Донецьк', 'Donetsk'], - ['Дмитро', 'Dmytro'], - // Ее - ['Рівне', 'Rivne'], - ['Олег', 'Oleh'], - ['Есмань', 'Esman'], - // Єє - ['Єнакієве', 'Yenakiieve'], - ['Гаєвич', 'Haievych'], - ['Короп\'є', 'Koropie'], - // Жж - ['Житомир', 'Zhytomyr'], - ['Жанна', 'Zhanna'], - ['Жежелів', 'Zhezheliv'], - // Зз - ['Закарпаття', 'Zakarpattia'], - ['Казимирчук', 'Kazymyrchuk'], - // Ии - ['Медвин', 'Medvyn'], - ['Михайленко', 'Mykhailenko'], - // Іі - ['Іванків', 'Ivankiv'], - ['Іващенко', 'Ivashchenko'], - // Її - ['Їжакевич', 'Yizhakevych'], - ['Кадиївка', 'Kadyivka'], - ['Мар\'їне', 'Marine'], - // Йй - ['Йосипівка', 'Yosypivka'], - ['Стрий', 'Stryi'], - ['Олексій', 'Oleksii'], - // Кк - ['Київ', 'Kyiv'], - ['Коваленко', 'Kovalenko'], - // Лл - ['Лебедин', 'Lebedyn'], - ['Леонід', 'Leonid'], - // Мм - ['Миколаїв', 'Mykolaiv'], - ['Маринич', 'Marynych'], - // Нн - ['Ніжин', 'Nizhyn'], - ['Наталія', 'Nataliia'], - // Оо - ['Одеса', 'Odesa'], - ['Онищенко', 'Onyshchenko'], - // Пп - ['Полтава', 'Poltava'], - ['Петро', 'Petro'], - // Рр - ['Решетилівка', 'Reshetylivka'], - ['Рибчинський', 'Rybchynskyi'], - // Сс - ['Суми', 'Sumy'], - ['Соломія', 'Solomiia'], - // Тт - ['Тернопіль', 'Ternopil'], - ['Троць', 'Trots'], - // Уу - ['Ужгород', 'Uzhhorod'], - ['Уляна', 'Uliana'], - // Фф - ['Фастів', 'Fastiv'], - ['Філіпчук', 'Filipchuk'], - // Хх - ['Харків', 'Kharkiv'], - ['Христина', 'Khrystyna'], - // Цц - ['Біла Церква', 'Bila Tserkva'], - ['Стеценко', 'Stetsenko'], - // Чч - ['Чернівці', 'Chernivtsi'], - ['Шевченко', 'Shevchenko'], - // Шш - ['Шостка', 'Shostka'], - ['Кишеньки', 'Kyshenky'], - // Щщ - ['Щербухи', 'Shcherbukhy'], - ['Гоща', 'Hoshcha'], - ['Гаращенко', 'Harashchenko'], - // Юю - ['Юрій', 'Yurii'], - ['Корюківка', 'Koriukivka'], - // Яя - ['Яготин', 'Yahotyn'], - ['Ярошенко', 'Yaroshenko'], - ['Костянтин', 'Kostiantyn'], - ['Знам\'янка', 'Znamianka'], - ['Феодосія', 'Feodosiia'], - // Some text - ['Добрий день', 'Dobryi den'], - ['Привіт світ!', 'Pryvit svit!'], - ]; + // Аа + yield ['Алушта', 'Alushta']; + yield ['Андрій', 'Andrii']; + // Бб + yield ['Борщагівка', 'Borshchahivka']; + yield ['Борисенко', 'Borysenko']; + // Вв + yield ['Вінниця', 'Vinnytsia']; + yield ['Володимир', 'Volodymyr']; + // Гг + yield ['Гадяч', 'Hadiach']; + yield ['Богдан', 'Bohdan']; + yield ['Згурський', 'Zghurskyi']; + // Ґґ + yield ['Ґалаґан', 'Galagan']; + yield ['Ґорґани', 'Gorgany']; + // Дд + yield ['Донецьк', 'Donetsk']; + yield ['Дмитро', 'Dmytro']; + // Ее + yield ['Рівне', 'Rivne']; + yield ['Олег', 'Oleh']; + yield ['Есмань', 'Esman']; + // Єє + yield ['Єнакієве', 'Yenakiieve']; + yield ['Гаєвич', 'Haievych']; + yield ['Короп\'є', 'Koropie']; + // Жж + yield ['Житомир', 'Zhytomyr']; + yield ['Жанна', 'Zhanna']; + yield ['Жежелів', 'Zhezheliv']; + // Зз + yield ['Закарпаття', 'Zakarpattia']; + yield ['Казимирчук', 'Kazymyrchuk']; + // Ии + yield ['Медвин', 'Medvyn']; + yield ['Михайленко', 'Mykhailenko']; + // Іі + yield ['Іванків', 'Ivankiv']; + yield ['Іващенко', 'Ivashchenko']; + // Її + yield ['Їжакевич', 'Yizhakevych']; + yield ['Кадиївка', 'Kadyivka']; + yield ['Мар\'їне', 'Marine']; + // Йй + yield ['Йосипівка', 'Yosypivka']; + yield ['Стрий', 'Stryi']; + yield ['Олексій', 'Oleksii']; + // Кк + yield ['Київ', 'Kyiv']; + yield ['Коваленко', 'Kovalenko']; + // Лл + yield ['Лебедин', 'Lebedyn']; + yield ['Леонід', 'Leonid']; + // Мм + yield ['Миколаїв', 'Mykolaiv']; + yield ['Маринич', 'Marynych']; + // Нн + yield ['Ніжин', 'Nizhyn']; + yield ['Наталія', 'Nataliia']; + // Оо + yield ['Одеса', 'Odesa']; + yield ['Онищенко', 'Onyshchenko']; + // Пп + yield ['Полтава', 'Poltava']; + yield ['Петро', 'Petro']; + // Рр + yield ['Решетилівка', 'Reshetylivka']; + yield ['Рибчинський', 'Rybchynskyi']; + // Сс + yield ['Суми', 'Sumy']; + yield ['Соломія', 'Solomiia']; + // Тт + yield ['Тернопіль', 'Ternopil']; + yield ['Троць', 'Trots']; + // Уу + yield ['Ужгород', 'Uzhhorod']; + yield ['Уляна', 'Uliana']; + // Фф + yield ['Фастів', 'Fastiv']; + yield ['Філіпчук', 'Filipchuk']; + // Хх + yield ['Харків', 'Kharkiv']; + yield ['Христина', 'Khrystyna']; + // Цц + yield ['Біла Церква', 'Bila Tserkva']; + yield ['Стеценко', 'Stetsenko']; + // Чч + yield ['Чернівці', 'Chernivtsi']; + yield ['Шевченко', 'Shevchenko']; + // Шш + yield ['Шостка', 'Shostka']; + yield ['Кишеньки', 'Kyshenky']; + // Щщ + yield ['Щербухи', 'Shcherbukhy']; + yield ['Гоща', 'Hoshcha']; + yield ['Гаращенко', 'Harashchenko']; + // Юю + yield ['Юрій', 'Yurii']; + yield ['Корюківка', 'Koriukivka']; + // Яя + yield ['Яготин', 'Yahotyn']; + yield ['Ярошенко', 'Yaroshenko']; + yield ['Костянтин', 'Kostiantyn']; + yield ['Знам\'янка', 'Znamianka']; + yield ['Феодосія', 'Feodosiia']; + // Some text + yield ['Добрий день', 'Dobryi den']; + yield ['Привіт світ!', 'Pryvit svit!']; } - public function sentencesProvider(): array + public function sentencesProvider(): iterable { - return [ - ['Добрий день', 'Dobryi den'], - ['Привіт світ!', 'Pryvit svit!'], - ]; + yield ['Добрий день', 'Dobryi den']; + yield ['Привіт світ!', 'Pryvit svit!']; } }