From cbb94bcfac090f2bcc302b664059d2d0744e916a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar?= Date: Tue, 12 Apr 2022 11:38:58 -0300 Subject: [PATCH 1/4] Removes redundant uncountables and gets pluralizer language ruleset from config --- src/Illuminate/Support/Pluralizer.php | 48 ++++----------------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/src/Illuminate/Support/Pluralizer.php b/src/Illuminate/Support/Pluralizer.php index fbe518286f2f..19e3ef69ed32 100755 --- a/src/Illuminate/Support/Pluralizer.php +++ b/src/Illuminate/Support/Pluralizer.php @@ -3,58 +3,22 @@ namespace Illuminate\Support; use Doctrine\Inflector\InflectorFactory; +use Illuminate\Container\Container; class Pluralizer { /** - * Uncountable word forms. + * Uncountable non-nouns word forms. + * Only words not listed on Doctrine/Inflector/Rules/English/Uninflected.php + * Unlisted nouns should be primarily requested there. * * @var string[] */ public static $uncountable = [ - 'audio', - 'bison', 'cattle', - 'chassis', - 'compensation', - 'coreopsis', - 'data', - 'deer', - 'education', - 'emoji', - 'equipment', - 'evidence', - 'feedback', - 'firmware', - 'fish', - 'furniture', - 'gold', - 'hardware', - 'information', - 'jedi', 'kin', - 'knowledge', - 'love', - 'metadata', - 'money', - 'moose', - 'news', - 'nutrition', - 'offspring', - 'plankton', - 'pokemon', - 'police', - 'rain', 'recommended', 'related', - 'rice', - 'series', - 'sheep', - 'software', - 'species', - 'swine', - 'traffic', - 'wheat', ]; /** @@ -133,7 +97,9 @@ public static function inflector() static $inflector; if (is_null($inflector)) { - $inflector = InflectorFactory::createForLanguage('english')->build(); + $app = Container::getInstance(); + $language = $app->has('config') ? $app['config']->get('app.pluralizer.language', 'english') : 'english'; + $inflector = InflectorFactory::createForLanguage($language)->build(); } return $inflector; From fefad7876063facaec5b1adfca834038ca8b611f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar?= Date: Wed, 13 Apr 2022 14:16:56 -0300 Subject: [PATCH 2/4] Portuguese Pluralizer Test --- .../Support/PluralizerPortugueseTest.php | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 tests/Integration/Support/PluralizerPortugueseTest.php diff --git a/tests/Integration/Support/PluralizerPortugueseTest.php b/tests/Integration/Support/PluralizerPortugueseTest.php new file mode 100644 index 000000000000..a3d75707c0fe --- /dev/null +++ b/tests/Integration/Support/PluralizerPortugueseTest.php @@ -0,0 +1,95 @@ +set('app.pluralizer.language', 'portuguese'); + } + + public function testBasicSingular() + { + $this->assertSame('herói', Str::singular('heróis')); + $this->assertSame('irmão', Str::singular('irmãos')); + $this->assertSame('chafariz', Str::singular('chafarizes')); + $this->assertSame('colher', Str::singular('colheres')); + $this->assertSame('modelo', Str::singular('modelos')); + $this->assertSame('venda', Str::singular('vendas')); + $this->assertSame('usuário', Str::singular('usuários')); + $this->assertSame('comissão', Str::singular('comissões')); + } + + public function testIrregulars() + { + $this->assertSame('males', Str::plural('mal')); + $this->assertSame('lápis', Str::singular('lápis')); + } + + public function testBasicPlural() + { + $this->assertSame('fênix', Str::plural('fênix')); + $this->assertSame('palavras', Str::plural('palavra')); + $this->assertSame('modelos', Str::plural('modelo')); + $this->assertSame('vendas', Str::plural('venda')); + $this->assertSame('usuários', Str::plural('usuário')); + $this->assertSame('comissões', Str::plural('comissão')); + } + + public function testCaseSensitiveSingularUsage() + { + $this->assertSame('Criança', Str::singular('Crianças')); + $this->assertSame('CIDADÃO', Str::singular('CIDADÃOS')); + } + + public function testCaseSensitiveSingularPlural() + { + $this->assertSame('Crianças', Str::plural('Criança')); + $this->assertSame('CIDADÃOS', Str::plural('CIDADÃO')); + $this->assertSame('Testes', Str::plural('Teste')); + } + + public function testPluralAppliedForStringEndingWithNumericCharacter() + { + $this->assertSame('Usuário1s', Str::plural('Usuário1')); + $this->assertSame('Usuário2s', Str::plural('Usuário2')); + $this->assertSame('Usuário3s', Str::plural('Usuário3')); + } + + public function testPluralSupportsArrays() + { + $this->assertSame('usuários', Str::plural('usuário', [])); + $this->assertSame('usuário', Str::plural('usuário', ['um'])); + $this->assertSame('usuários', Str::plural('usuário', ['um', 'dois'])); + } + + public function testPluralSupportsCollections() + { + $this->assertSame('usuários', Str::plural('usuário', collect())); + $this->assertSame('usuário', Str::plural('usuário', collect(['um']))); + $this->assertSame('usuários', Str::plural('usuário', collect(['um', 'dois']))); + } + + public function testPluralStudlySupportsArrays() + { + $this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', []); + $this->assertPluralStudly('AlgumUsuário', 'AlgumUsuário', ['um']); + $this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', ['um', 'dois']); + } + + public function testPluralStudlySupportsCollections() + { + $this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', collect()); + $this->assertPluralStudly('AlgumUsuário', 'AlgumUsuário', collect(['um'])); + $this->assertPluralStudly('AlgumUsuários', 'AlgumUsuário', collect(['um', 'dois'])); + } + + private function assertPluralStudly($expected, $value, $count = 2) + { + $this->assertSame($expected, Str::pluralStudly($value, $count)); + } +} From 45fc267d4dbfba9c047754ec2200d42fa55b505a Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 18 Apr 2022 15:17:08 -0500 Subject: [PATCH 3/4] refactor --- src/Illuminate/Support/Pluralizer.php | 42 ++++++++++++++----- .../Support/PluralizerPortugueseTest.php | 14 ++++++- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/Illuminate/Support/Pluralizer.php b/src/Illuminate/Support/Pluralizer.php index 19e3ef69ed32..814d55bf334d 100755 --- a/src/Illuminate/Support/Pluralizer.php +++ b/src/Illuminate/Support/Pluralizer.php @@ -3,14 +3,13 @@ namespace Illuminate\Support; use Doctrine\Inflector\InflectorFactory; -use Illuminate\Container\Container; class Pluralizer { /** * Uncountable non-nouns word forms. - * Only words not listed on Doctrine/Inflector/Rules/English/Uninflected.php - * Unlisted nouns should be primarily requested there. + * + * Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php * * @var string[] */ @@ -21,6 +20,20 @@ class Pluralizer 'related', ]; + /** + * The language that should be used by the inflector. + * + * @var string + */ + protected static $language = 'english'; + + /** + * The cached inflector instance. + * + * @var static + */ + protected static $inflector; + /** * Get the plural form of an English word. * @@ -94,14 +107,23 @@ protected static function matchCase($value, $comparison) */ public static function inflector() { - static $inflector; - - if (is_null($inflector)) { - $app = Container::getInstance(); - $language = $app->has('config') ? $app['config']->get('app.pluralizer.language', 'english') : 'english'; - $inflector = InflectorFactory::createForLanguage($language)->build(); + if (is_null(static::$inflector)) { + static::$inflector = InflectorFactory::createForLanguage(static::$language)->build(); } - return $inflector; + return static::$inflector; + } + + /** + * Specify the language that should be used by the inflector. + * + * @param string $language + * @return void + */ + public static function useLanguage(string $language) + { + static::$language = $language; + + static::$inflector = null; } } diff --git a/tests/Integration/Support/PluralizerPortugueseTest.php b/tests/Integration/Support/PluralizerPortugueseTest.php index a3d75707c0fe..754ec2281575 100644 --- a/tests/Integration/Support/PluralizerPortugueseTest.php +++ b/tests/Integration/Support/PluralizerPortugueseTest.php @@ -2,14 +2,24 @@ namespace Illuminate\Tests\Integration\Support; +use Illuminate\Support\Pluralizer; use Illuminate\Support\Str; use Orchestra\Testbench\TestCase; class PluralizerPortugueseTest extends TestCase { - protected function getEnvironmentSetUp($app) + public function setUp(): void { - $app['config']->set('app.pluralizer.language', 'portuguese'); + parent::setUp(); + + Pluralizer::useLanguage('portuguese'); + } + + public function tearDown(): void + { + parent::tearDown(); + + Pluralizer::useLanguage('english'); } public function testBasicSingular() From 4dc1aa9912c32a99053a595433c3d2a052d602cf Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 18 Apr 2022 15:17:55 -0500 Subject: [PATCH 4/4] formatting --- src/Illuminate/Support/Pluralizer.php | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Illuminate/Support/Pluralizer.php b/src/Illuminate/Support/Pluralizer.php index 814d55bf334d..9a9228c769fe 100755 --- a/src/Illuminate/Support/Pluralizer.php +++ b/src/Illuminate/Support/Pluralizer.php @@ -7,18 +7,11 @@ class Pluralizer { /** - * Uncountable non-nouns word forms. - * - * Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php + * The cached inflector instance. * - * @var string[] + * @var static */ - public static $uncountable = [ - 'cattle', - 'kin', - 'recommended', - 'related', - ]; + protected static $inflector; /** * The language that should be used by the inflector. @@ -28,11 +21,18 @@ class Pluralizer protected static $language = 'english'; /** - * The cached inflector instance. + * Uncountable non-nouns word forms. * - * @var static + * Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php + * + * @var string[] */ - protected static $inflector; + public static $uncountable = [ + 'cattle', + 'kin', + 'recommended', + 'related', + ]; /** * Get the plural form of an English word.