From 138f2120954b0cc7c68e03fe695247562e42e831 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 19 Sep 2015 00:07:09 +0300 Subject: [PATCH 1/9] add .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0cc2124 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.iml +.idea/ From 2cc771fb92df63f7e851dc39c893f5a9572fe40c Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 17:32:36 +0300 Subject: [PATCH 2/9] add composer.lock to ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0cc2124..1f3747b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.iml .idea/ +composer.lock From f078d74c646a60eb1a65ada2fe6fd6117d6efe00 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 18:18:49 +0300 Subject: [PATCH 3/9] actualize the tests --- .gitignore | 1 + composer.json | 9 ++ test/DistanceOfTimeInWordsTest.php | 219 ++++++++++++++--------------- test/bootstrap.php | 12 +- test/phpunit.xml | 2 +- 5 files changed, 125 insertions(+), 118 deletions(-) diff --git a/.gitignore b/.gitignore index 1f3747b..3abc947 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.iml .idea/ composer.lock +vendor diff --git a/composer.json b/composer.json index 00f8dac..862682d 100644 --- a/composer.json +++ b/composer.json @@ -6,9 +6,18 @@ "keywords": ["transliteration", "numeral is words", "russian dates", "typography"], "homepage": "https://github.com/Andre-487/php_rutils", "license": "MIT", + "repositories": [ + { + "type": "git", + "url": "https://github.com/Andre-487/php_rutils" + } + ], "require": { "php":">=5.3.0" }, + "require-dev": { + "phpunit/phpunit": "~5.0" + }, "autoload":{ "psr-0":{ "php_rutils": ".." diff --git a/test/DistanceOfTimeInWordsTest.php b/test/DistanceOfTimeInWordsTest.php index 4bfb2f6..15b8e67 100644 --- a/test/DistanceOfTimeInWordsTest.php +++ b/test/DistanceOfTimeInWordsTest.php @@ -2,7 +2,6 @@ namespace php_rutils\test; use php_rutils\RUtils; -use php_rutils\struct\TimeParams; class DistanceOfTimeInWordsTest extends \PHPUnit_Framework_TestCase { @@ -30,39 +29,39 @@ public function testAccuracyYear() $testData = array( //past date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад', - date('Y-m-d H:i:s', $nowTime - 60) => 'минуту назад', - date('Y-m-d H:i:s', $nowTime - 2*60) => '2 минуты назад', - date('Y-m-d H:i:s', $nowTime - 5*60) => '5 минут назад', - date('Y-m-d H:i:s', $nowTime - 60*60) => 'час назад', - date('Y-m-d H:i:s', $nowTime - 2*60*60) => '2 часа назад', - date('Y-m-d H:i:s', $nowTime - 5*60*60) => '5 часов назад', + date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад", date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера', date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера', - date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => '3 дня назад', - date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => '8 дней назад', - date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => 'месяц назад', - date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => '2 месяца назад', - ($nowTime - 366*24*60*60) => 'год назад', - ($nowTime - 2*370*24*60*60) => '2 года назад', - ($nowTime - 10*370*24*60*60) => '10 лет назад', + date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "месяц\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца\xC2\xA0назад", + ($nowTime - 366*24*60*60) => "год\xC2\xA0назад", + ($nowTime - 2*370*24*60*60) => "2 года\xC2\xA0назад", + ($nowTime - 10*370*24*60*60) => "10 лет\xC2\xA0назад", //future date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? 'через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? 'через 2 минуты' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? 'через 5 минут' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? 'через час' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? 'через 2 часа' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? 'через 5 часов' : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'), date('Y-m-d H:i:s', $tomorrow) => 'завтра', date('Y-m-d H:i:s', $afterTomorrow) => 'послезавтра', - date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => 'через 3 дня', - date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => 'через 8 дней', - date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => 'через месяц', - date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => 'через 2 месяца', - ($nowTime + 366*24*60*60) => 'через год', - ($nowTime + 2*370*24*60*60) => 'через 2 года', - ($nowTime + 10*370*24*60*60) => 'через 10 лет', + date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня", + date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней", + date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA0месяц", + date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца", + ($nowTime + 366*24*60*60) => "через\xC2\xA0год", + ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года", + ($nowTime + 10*370*24*60*60) => "через\xC2\xA010 лет", ); foreach ($testData as $toTime => $expected) @@ -82,39 +81,39 @@ public function testAccuracyMonth() $testData = array( //past date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад', - date('Y-m-d H:i:s', $nowTime - 60) => 'минуту назад', - date('Y-m-d H:i:s', $nowTime - 2*60) => '2 минуты назад', - date('Y-m-d H:i:s', $nowTime - 5*60) => '5 минут назад', - date('Y-m-d H:i:s', $nowTime - 60*60) => 'час назад', - date('Y-m-d H:i:s', $nowTime - 2*60*60) => '2 часа назад', - date('Y-m-d H:i:s', $nowTime - 5*60*60) => '5 часов назад', + date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад", date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера', date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера', - date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => '3 дня назад', - date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => '8 дней назад', - date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => 'месяц назад', - date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => '2 месяца назад', - ($nowTime - 366*24*60*60) => 'год назад', - ($nowTime - 2*370*24*60*60) => '2 года назад', - ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => '10 лет, %d месяц%S назад', + date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "месяц\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца\xC2\xA0назад", + ($nowTime - 366*24*60*60) => "год\xC2\xA0назад", + ($nowTime - 2*370*24*60*60) => "2 года\xC2\xA0назад", + ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад", //future date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? 'через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? 'через 2 минуты' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? 'через 5 минут' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? 'через час' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? 'через 2 часа' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? 'через 5 часов' : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'), date('Y-m-d H:i:s', $tomorrow) => 'завтра', date('Y-m-d H:i:s', $afterTomorrow) => 'послезавтра', - date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => 'через 3 дня', - date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => 'через 8 дней', - date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => 'через месяц', - date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => 'через 2 месяца', - ($nowTime + 366*24*60*60) => 'через год', - ($nowTime + 2*370*24*60*60) => 'через 2 года', - ($nowTime + 10*370*24*60*60 + 2*24*60*60 + 12) => 'через 10 лет, %d месяц%S', + date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня", + date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней", + date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA0месяц", + date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца", + ($nowTime + 366*24*60*60) => "через\xC2\xA0год", + ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года", + ($nowTime + 10*370*24*60*60 + 2*24*60*60 + 12) => "через\xC2\xA010 лет, %d месяц%S", ); foreach ($testData as $toTime => $format) @@ -134,40 +133,40 @@ public function testAccuracyDay() $testData = array( //past date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад', - date('Y-m-d H:i:s', $nowTime - 60) => 'минуту назад', - date('Y-m-d H:i:s', $nowTime - 2*60) => '2 минуты назад', - date('Y-m-d H:i:s', $nowTime - 5*60) => '5 минут назад', - date('Y-m-d H:i:s', $nowTime - 60*60) => 'час назад', - date('Y-m-d H:i:s', $nowTime - 2*60*60) => '2 часа назад', - date('Y-m-d H:i:s', $nowTime - 5*60*60) => '5 часов назад', + date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад", date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера', date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера', - date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => '3 дня назад', - date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => '8 дней назад', - date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => '1 месяц, %d д%s назад', - date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => '2 месяца, %d д%s назад', - ($nowTime - 366*24*60*60) => '1 год, %d д%s назад', - ($nowTime - 2*370*24*60*60 - 72*24*60*60 - 12*60) => '2 года, 2 месяца, %d д%s назад', - ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => '10 лет, %d месяц%S назад', - ($nowTime - 10*370*24*60*60 - 62*24*60*60) => '10 лет, %d месяц%s, %d д%s назад', + date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "1 месяц, %d д%s\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца, %d д%s\xC2\xA0назад", + ($nowTime - 366*24*60*60) => "1 год, %d д%s\xC2\xA0назад", + ($nowTime - 2*370*24*60*60 - 72*24*60*60 - 12*60) => "2 года, 2 месяца, %d д%s\xC2\xA0назад", + ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад", + ($nowTime - 10*370*24*60*60 - 62*24*60*60) => "10 лет, %d месяц%s, %d д%s\xC2\xA0назад", //future date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? 'через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? 'через 2 минуты' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? 'через 5 минут' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? 'через час' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? 'через 2 часа' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? 'через 5 часов' : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'), date('Y-m-d H:i:s', $tomorrow) => 'завтра', date('Y-m-d H:i:s', $afterTomorrow) => 'послезавтра', - date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => 'через 3 дня', - date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => 'через 8 дней', - date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => 'через 1 месяц, %d д%s', - date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => 'через 2 месяца, %d д%s', - ($nowTime + 367*24*60*60) => 'через 1 год, %d д%s', - ($nowTime + 2*370*24*60*60) => 'через 2 года, %d д%s', - ($nowTime + 10*370*24*60*60 + 65*24*60*60 + 12) => 'через 10 лет, %d месяц%S, %d д%s', + date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня", + date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней", + date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA01 месяц, %d д%s", + date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца, %d д%s", + ($nowTime + 367*24*60*60) => "через\xC2\xA01 год, %d д%s", + ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года, %d д%s", + ($nowTime + 10*370*24*60*60 + 65*24*60*60 + 12) => "через\xC2\xA010 лет, %d месяц%S, %d д%s", ); foreach ($testData as $toTime => $format) @@ -186,39 +185,39 @@ public function testAccuracyMinute() $testData = array( //past date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад', - date('Y-m-d H:i:s', $nowTime - 60) => 'минуту назад', - date('Y-m-d H:i:s', $nowTime - 2*60) => '2 минуты назад', - date('Y-m-d H:i:s', $nowTime - 5*60) => '5 минут назад', - date('Y-m-d H:i:s', $nowTime - 60*60) => 'час назад', - date('Y-m-d H:i:s', $nowTime - 2*60*60) => '2 часа назад', - date('Y-m-d H:i:s', $nowTime - 5*60*60) => '5 часов назад', + date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад", date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера', date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера', - date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => '3 дня назад', - date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => '8 дней, 1 час назад', - date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => '1 месяц, %d д%s назад', - date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => '2 месяца, %d д%s назад', - ($nowTime - 366*24*60*60) => '1 год, %d д%s назад', - ($nowTime - 2*370*24*60*60 - 72*24*60*60 - 12*60) => '2 года, 2 месяца, %d д%s назад', - ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => '10 лет, %d месяц%S назад', - ($nowTime - 10*370*24*60*60 - 62*24*60*60) => '10 лет, %d месяц%s, %d д%s назад', - ($nowTime - 10*370*24*60*60 - 65*24*60*60 - 90*60) => '10 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S назад', + date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней, 1 час\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "1 месяц, %d д%s\xC2\xA0назад", + date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца, %d д%s\xC2\xA0назад", + ($nowTime - 366*24*60*60) => "1 год, %d д%s\xC2\xA0назад", + ($nowTime - 2*370*24*60*60 - 72*24*60*60 - 12*60) => "2 года, 2 месяца, %d д%s\xC2\xA0назад", + ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад", + ($nowTime - 10*370*24*60*60 - 62*24*60*60) => "10 лет, %d месяц%s, %d д%s\xC2\xA0назад", + ($nowTime - 10*370*24*60*60 - 65*24*60*60 - 90*60) => "10 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S\xC2\xA0назад", //future date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? 'через минуту' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? 'через 2 минуты' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? 'через 5 минут' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? 'через час' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? 'через 2 часа' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? 'через 5 часов' : 'завтра'), - date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => 'через 3 дня', - date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => 'через 8 дней', - date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => 'через 1 месяц, %d д%s', - date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => 'через 2 месяца, %d д%s', - ($nowTime + 367*24*60*60) => 'через 1 год, %d д%s', - ($nowTime + 2*370*24*60*60) => 'через 2 года, %d д%s', - ($nowTime + 10*370*24*60*60 + 65*24*60*60 + 90*60) => 'через 10 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S', + date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'), + date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня", + date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней", + date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA01 месяц, %d д%s", + date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца, %d д%s", + ($nowTime + 367*24*60*60) => "через\xC2\xA01 год, %d д%s", + ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года, %d д%s", + ($nowTime + 10*370*24*60*60 + 65*24*60*60 + 90*60) => "через\xC2\xA010 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S", ); foreach ($testData as $toTime => $format) @@ -237,7 +236,7 @@ public function testFromTimePast() $toTime->add(new \DateInterval('P11Y3M12DT4H2M')); $this->assertEquals( - 'через 67 лет, 3 месяца, 12 дней, 4 часа, 2 минуты', + "через\xC2\xA067 лет, 3 месяца, 12 дней, 4 часа, 2 минуты", $this->_object->distanceOfTimeInWords($toTime, $fromTime, RUtils::ACCURACY_MINUTE) ); } @@ -254,7 +253,7 @@ public function testFromTimeFuture() $toTime->sub(new \DateInterval('P11Y3M12DT4H2M')); $this->assertEquals( - '67 лет, 3 месяца, 12 дней, 4 часа, 2 минуты назад', + "67 лет, 3 месяца, 12 дней, 4 часа, 2 минуты\xC2\xA0назад", $this->_object->distanceOfTimeInWords($toTime, $fromTime, RUtils::ACCURACY_MINUTE) ); } diff --git a/test/bootstrap.php b/test/bootstrap.php index 775b364..35293f4 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -6,10 +6,8 @@ error_reporting(E_ALL | E_STRICT); mb_internal_encoding('UTF-8'); -spl_autoload_register(function($className) { - $classPath = LIB_DIR. DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php'; - if (is_file($classPath)) - require_once $classPath; - else - throw new \Exception("Wrong class path $classPath"); - }); +spl_autoload_register(function ($className) { + $classPath = LIB_DIR.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php'; + if (is_file($classPath)) + require_once $classPath; +}); diff --git a/test/phpunit.xml b/test/phpunit.xml index 98f4bcb..5c68fe0 100644 --- a/test/phpunit.xml +++ b/test/phpunit.xml @@ -2,7 +2,7 @@ - ../ + . From 2c0d54c4959e5cd363060f0238907d278a1a3d33 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 18:27:19 +0300 Subject: [PATCH 4/9] format composer.json --- composer.json | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index 862682d..b10f9b2 100644 --- a/composer.json +++ b/composer.json @@ -1,26 +1,26 @@ { - "name": "andre_487/php_rutils", - "description": "RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography)", - "version": "1.1.1", - "type": "library", - "keywords": ["transliteration", "numeral is words", "russian dates", "typography"], - "homepage": "https://github.com/Andre-487/php_rutils", - "license": "MIT", - "repositories": [ - { - "type": "git", - "url": "https://github.com/Andre-487/php_rutils" - } - ], - "require": { - "php":">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~5.0" - }, - "autoload":{ - "psr-0":{ - "php_rutils": ".." - } + "name": "andre_487/php_rutils", + "description": "RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography)", + "version": "1.1.1", + "type": "library", + "keywords": ["transliteration", "numeral is words", "russian dates", "typography"], + "homepage": "https://github.com/Andre-487/php_rutils", + "license": "MIT", + "repositories": [ + { + "type": "git", + "url": "https://github.com/Andre-487/php_rutils" } + ], + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~5.0" + }, + "autoload": { + "psr-0": { + "php_rutils": ".." + } + } } From 101a164b939c2b956f9d59f859dc45fb07e32219 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 18:36:59 +0300 Subject: [PATCH 5/9] add editorconfig --- .editorconfig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..01455d1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# editorconfig.org + +[*] +charset = utf-8 +end_of_line = lf + +indent_style = space +indent_size = 4 + +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{json,yml}] +indent_size = 2 From 0f47edfa3fb51fdb5552e599312af7c25f5a56b9 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 18:45:24 +0300 Subject: [PATCH 6/9] add Travis support --- .travis.yml | 7 +++++++ composer.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7d6aaed --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: php +php: + - 5.3 + - 5.6 + +before_script: composer install --dev +script: ./vendor/bin/phpunit --config test/phpunit.xml diff --git a/composer.json b/composer.json index b10f9b2..4a5a590 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "~5.0" + "phpunit/phpunit": "~4.8" }, "autoload": { "psr-0": { From 7e1688b450214b77bbc8e832d056c77d212b3bb9 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 19:10:08 +0300 Subject: [PATCH 7/9] add build status --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b076bf..943e104 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ PHP RUtils ---------- -RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography) for PHP. +[![Build Status](https://travis-ci.org/Andre-487/php_rutils.svg)](https://travis-ci.org/Andre-487/php_rutils) + +RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography) for PHP. This is a port of the Python [Pytils](https://github.com/j2a/pytils) to PHP. -See additional docs and examples in [doc subdir](https://github.com/Andre-487/php_rutils/tree/master/doc). +See additional docs and examples in [doc subdir](https://github.com/Andre-487/php_rutils/tree/master/doc). Library is published on the Composer: https://packagist.org/packages/andre_487/php_rutils From da9ef589f4db457e83fa77c3d65b6be7b2dbae69 Mon Sep 17 00:00:00 2001 From: Andre-487 Date: Sat, 24 Oct 2015 19:46:30 +0300 Subject: [PATCH 8/9] code style and PHP_CodeSniffer --- .travis.yml | 11 +- Dt.php | 96 ++++++----- Numeral.php | 125 +++++++++------ README.md | 5 + RUtils.php | 14 +- Translit.php | 108 ++++++++----- Typo.php | 20 ++- TypoRules.php | 11 +- composer.json | 3 +- doc/examples/_begin.php | 16 +- doc/examples/_end.php | 3 +- doc/quick-start.ru.html | 8 +- struct/TimeParams.php | 8 +- test/DistanceOfTimeInWordsTest.php | 249 +++++++++++++++-------------- test/DtTest.php | 6 +- test/NumeralTest.php | 26 +-- test/TranslitTest.php | 9 +- test/TypoTest.php | 61 +++---- test/bootstrap.php | 13 +- 19 files changed, 470 insertions(+), 322 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7d6aaed..47c6a9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,14 @@ language: php +sudo: false + php: - 5.3 - 5.6 -before_script: composer install --dev -script: ./vendor/bin/phpunit --config test/phpunit.xml +before_script: + - composer install --dev + - ./vendor/bin/phpcs --config-set show_warnings 0 + +script: + - ./vendor/bin/phpunit --config test/phpunit.xml + - ./vendor/bin/phpcs --standard=PSR2 --ignore=vendor . diff --git a/Dt.php b/Dt.php index d3b3edc..f813dc7 100644 --- a/Dt.php +++ b/Dt.php @@ -55,22 +55,26 @@ class Dt public function ruStrFTime($params = null) { //Params handle - if ($params === null) + if ($params === null) { $params = new TimeParams(); - elseif (is_array($params)) + } elseif (is_array($params)) { $params = TimeParams::create($params); - else + } else { $params = clone $params; + } - if ($params->date === null) + if ($params->date === null) { $params->date = new \DateTime(); - else + } else { $params->date = $this->_processDateTime($params->date); + } - if (is_string($params->timezone)) + if (is_string($params->timezone)) { $params->timezone = new \DateTimeZone($params->timezone); - if ($params->timezone) + } + if ($params->timezone) { $params->date->setTimezone($params->timezone); + } //Format processing $weekday = $params->date->format('N') - 1; @@ -114,11 +118,9 @@ private function _processDateTime($dateTime) $timestamp = $dateTime; $dateTime = new \DateTime(); $dateTime->setTimestamp($timestamp); - } - elseif (empty($dateTime)) { + } elseif (empty($dateTime)) { throw new \InvalidArgumentException('Date/time is empty'); - } - elseif (is_string($dateTime)) { + } elseif (is_string($dateTime)) { $dateTime = new \DateTime($dateTime); } @@ -137,10 +139,12 @@ private function _processDateTime($dateTime) * @throws \RuntimeException * @return string Distance of time in words */ - public function distanceOfTimeInWords($toTime, $fromTime=null, $accuracy=RUtils::ACCURACY_YEAR) { + public function distanceOfTimeInWords($toTime, $fromTime = null, $accuracy = RUtils::ACCURACY_YEAR) + { $accuracy = (int)$accuracy; - if ($accuracy < 1 || $accuracy > 5) + if ($accuracy < 1 || $accuracy > 5) { throw new \InvalidArgumentException('Wrong accuracy value (must be 1..5)'); + } /* @var $toTime \DateTime */ /* @var $fromTime \DateTime */ @@ -151,15 +155,16 @@ public function distanceOfTimeInWords($toTime, $fromTime=null, $accuracy=RUtils: //if diff less than one minute if ($interval->days == 0 && $interval->h == 0 && $interval->i == 0) { - if ($interval->invert) + if ($interval->invert) { $result = 'менее чем через минуту'; - else + } else { $result = 'менее минуты назад'; + } return $result; } //create distance table - $distanceData = $this->_createDistanceData($interval, $fromCurrent); + $distanceData = $this->_createDistanceData($interval); $words = $this->_getResultWords($accuracy, $distanceData); //check short result @@ -168,12 +173,12 @@ public function distanceOfTimeInWords($toTime, $fromTime=null, $accuracy=RUtils: $result = $this->_getOneWordResult($interval); if ($result) { return $result; - } - elseif ($interval->days < 3) { + } elseif ($interval->days < 3) { //if diff 1 or 2 days $result = $this->_getTwoDaysResult($interval, $toTime, $timeZone); - if ($result) + if ($result) { return $result; + } } } @@ -191,8 +196,7 @@ private function _processFunctionParams($toTime, $fromTime) if ($fromTime === null) { $fromTime = new \DateTime('now', $timeZone); $fromCurrent = true; - } - else { + } else { $fromTime = $this->_processDateTime($fromTime); } @@ -205,24 +209,29 @@ private function _createDistanceData(\DateInterval $interval) $numeral = RUtils::numeral(); $years = $interval->y; - if ($years) + if ($years) { $distanceData['y'] = $numeral->getPlural($years, self::$_YEAR_VARIANTS); + } $months = $interval->m; - if ($months) + if ($months) { $distanceData['m'] = $numeral->getPlural($months, self::$_MONTH_VARIANTS); + } $days = $interval->d; - if ($days) + if ($days) { $distanceData['d'] = $numeral->getPlural($days, self::$_DAY_VARIANTS); + } $hours = $interval->h; - if ($hours) + if ($hours) { $distanceData['h'] = $numeral->getPlural($hours, self::$_HOUR_VARIANTS); + } $minutes = $interval->i; - if ($minutes) + if ($minutes) { $distanceData['i'] = $numeral->getPlural($minutes, self::$_MINUTE_VARIANTS); + } return $distanceData; } @@ -256,20 +265,20 @@ private function _getMinutesResult(array $distanceData) return $this->_getLevelResult('i', $distanceData, $words, $borderField); } - private function _getLevelResult($fieldCode, array $distanceData, array $words=array(), $borderField=-1) + private function _getLevelResult($fieldCode, array $distanceData, array $words = array(), $borderField = -1) { $curPos = array_search($fieldCode, self::$_DISTANCE_FIELDS); - if ($borderField >= $curPos) + if ($borderField >= $curPos) { return array($words, $borderField); + } $nextField = $borderField + 1; $length = sizeof(self::$_DISTANCE_FIELDS); - for ($i=$nextField; $i < $length; ++$i) { + for ($i = $nextField; $i < $length; ++$i) { $field = self::$_DISTANCE_FIELDS[$i]; if ($borderField != -1 && $i > $curPos) { break; - } - elseif (isset($distanceData[$field])) { + } elseif (isset($distanceData[$field])) { $words[] = $distanceData[$field]; $borderField = $i; break; @@ -281,17 +290,19 @@ private function _getLevelResult($fieldCode, array $distanceData, array $words=a private function _getOneWordResult(\DateInterval $interval) { $result = null; - if ($interval->days == 0 && $interval->h == 0 && $interval->i == 1) + if ($interval->days == 0 && $interval->h == 0 && $interval->i == 1) { $result = 'минуту'; - elseif ($interval->days == 0 && $interval->h == 1) + } elseif ($interval->days == 0 && $interval->h == 1) { $result = 'час'; - elseif ($interval->y == 0 && $interval->m == 1) + } elseif ($interval->y == 0 && $interval->m == 1) { $result = 'месяц'; - elseif ($interval->y == 1) + } elseif ($interval->y == 1) { $result = 'год'; + } - if ($result) + if ($result) { $result = $this->_addResultSuffix($interval, $result); + } return $result; } @@ -303,7 +314,7 @@ private function _getOneWordResult(\DateInterval $interval) */ private function _addResultSuffix(\DateInterval $interval, $result) { - return $interval->invert ? self::$PREFIX_IN . "\xC2\xA0" . $result : $result . "\xC2\xA0" . self::$SUFFIX_AGO; + return $interval->invert ? self::$PREFIX_IN."\xC2\xA0".$result : $result."\xC2\xA0".self::$SUFFIX_AGO; } private function _getTwoDaysResult(\DateInterval $interval, \DateTime $toTime, \DateTimeZone $timeZone = null) @@ -314,17 +325,17 @@ private function _getTwoDaysResult(\DateInterval $interval, \DateTime $toTime, \ if ($interval->invert == 0 && ($days == 1 || $days == 2)) { $variant = $days - 1; $result = self::$_PAST_ALTERNATIVES[$variant]; - } - elseif ($interval->invert && ($days == 0 || $days == 1)) { + } elseif ($interval->invert && ($days == 0 || $days == 1)) { $tomorrow = new \DateTime('today', $timeZone); $tomorrow->add(new \DateInterval('P1D')); $afterTomorrow = new \DateTime('today', $timeZone); $afterTomorrow->add(new \DateInterval('P2D')); - if ($toTime >= $tomorrow && $toTime < $afterTomorrow) + if ($toTime >= $tomorrow && $toTime < $afterTomorrow) { $result = 'завтра'; - elseif ($days == 1 && $toTime >= $afterTomorrow) + } elseif ($days == 1 && $toTime >= $afterTomorrow) { $result = 'послезавтра'; + } } return $result; @@ -364,8 +375,9 @@ public function getAge($birthDate) { $birthDate = $this->_processDateTime($birthDate); $interval = $birthDate->diff(new \DateTime()); - if ($interval->invert) + if ($interval->invert) { throw new \InvalidArgumentException('Birth date is in future'); + } return $interval->y; } } diff --git a/Numeral.php b/Numeral.php index f29beca..90ce480 100644 --- a/Numeral.php +++ b/Numeral.php @@ -78,10 +78,11 @@ class Numeral */ public function getPlural($amount, array $variants, $absence = null) { - if ($amount || $absence === null) + if ($amount || $absence === null) { $result = RUtils::formatNumber($amount).' '.$this->choosePlural($amount, $variants); - else + } else { $result = $absence; + } return $result; } @@ -94,19 +95,21 @@ public function getPlural($amount, array $variants, $absence = null) */ public function choosePlural($amount, array $variants) { - if (sizeof($variants) < 3) + if (sizeof($variants) < 3) { throw new \InvalidArgumentException('Incorrect values length (must be 3)'); + } $amount = abs($amount); - $mod10 = $amount%10; - $mod100 = $amount%100; + $mod10 = $amount % 10; + $mod100 = $amount % 100; - if ($mod10 == 1 && $mod100 != 11) + if ($mod10 == 1 && $mod100 != 11) { $variant = 0; - elseif ($mod10 >= 2 && $mod10 <= 4 && !($mod100 > 10 && $mod100 < 20)) + } elseif ($mod10 >= 2 && $mod10 <= 4 && !($mod100 > 10 && $mod100 < 20)) { $variant = 1; - else + } else { $variant = 2; + } return $variants[$variant]; } @@ -120,17 +123,21 @@ public function choosePlural($amount, array $variants) * @throws \RangeException * @throws \InvalidArgumentException */ - public function sumString($amount, $gender, array $variants=null) + public function sumString($amount, $gender, array $variants = null) { - if ($variants === null) + if ($variants === null) { $variants = array_fill(0, 3, ''); - if (sizeof($variants) < 3) + } + if (sizeof($variants) < 3) { throw new \InvalidArgumentException('Incorrect items length (must be 3)'); - if ($amount < 0) + } + if ($amount < 0) { throw new \InvalidArgumentException('Amount must be positive or 0'); + } - if ($amount == 0) - return trim('ноль '.$variants[2]); + if ($amount == 0) { + return trim('ноль '.$variants[2]); + } $result = ''; $tmpVal = $amount; @@ -138,14 +145,26 @@ public function sumString($amount, $gender, array $variants=null) //ones list($result, $tmpVal) = $this->_sumStringOneOrder($result, $tmpVal, $gender, $variants); //thousands - list($result, $tmpVal) = $this->_sumStringOneOrder($result, $tmpVal, RUtils::FEMALE, - array('тысяча', 'тысячи', 'тысяч')); + list($result, $tmpVal) = $this->_sumStringOneOrder( + $result, + $tmpVal, + RUtils::FEMALE, + array('тысяча', 'тысячи', 'тысяч') + ); //millions - list($result, $tmpVal) = $this->_sumStringOneOrder($result, $tmpVal, RUtils::MALE, - array('миллион', 'миллиона', 'миллионов')); + list($result, $tmpVal) = $this->_sumStringOneOrder( + $result, + $tmpVal, + RUtils::MALE, + array('миллион', 'миллиона', 'миллионов') + ); //billions - list($result,) = $this->_sumStringOneOrder($result, $tmpVal, RUtils::MALE, - array('миллиард', 'миллиарда', 'миллиардов')); + list($result,) = $this->_sumStringOneOrder( + $result, + $tmpVal, + RUtils::MALE, + array('миллиард', 'миллиарда', 'миллиардов') + ); return trim($result); } @@ -160,39 +179,41 @@ public function sumString($amount, $gender, array $variants=null) */ private function _sumStringOneOrder($prevResult, $tmpVal, $gender, array $variants) { - if ($tmpVal == 0) + if ($tmpVal == 0) { return array($prevResult, $tmpVal); + } $words = array(); $fiveItems = $variants[2]; - $rest = $tmpVal%1000; - if ($rest < 0) + $rest = $tmpVal % 1000; + if ($rest < 0) { throw new \RangeException('Int overflow'); + } - $tmpVal = intval($tmpVal/1000); + $tmpVal = intval($tmpVal / 1000); //check last digits are 0 if ($rest == 0) { - if (!$prevResult) + if (!$prevResult) { $prevResult = $fiveItems.' '; + } return array($prevResult, $tmpVal); } //hundreds - $words[] = self::$_HUNDREDS[intval($rest/100)]; + $words[] = self::$_HUNDREDS[intval($rest / 100)]; //tens $rest %= 100; - $rest1 = intval($rest/10); + $rest1 = intval($rest / 10); $words[] = ($rest1 == 1) ? self::$_TENS[$rest] : self::$_TENS[$rest1]; //ones if ($rest1 == 1) { $endWord = $fiveItems; - } - else { - $amount = $rest%10; - $words[] = self::$_ONES[$amount][$gender-1]; + } else { + $amount = $rest % 10; + $words[] = self::$_ONES[$amount][$gender - 1]; $endWord = $this->choosePlural($amount, $variants); } $words[] = $endWord; @@ -210,12 +231,13 @@ private function _sumStringOneOrder($prevResult, $tmpVal, $gender, array $varian * @param int|null $gender (MALE, FEMALE, NEUTER or null) * @return string In-words representation of numeral */ - public function getInWords($amount, $gender=RUtils::MALE) + public function getInWords($amount, $gender = RUtils::MALE) { - if ($amount == (int)$amount) + if ($amount == (int)$amount) { return $this->getInWordsInt($amount, $gender); - else + } else { return $this->getInWordsFloat($amount); + } } /** @@ -224,7 +246,7 @@ public function getInWords($amount, $gender=RUtils::MALE) * @param int $gender (MALE, FEMALE or NEUTER) * @return string In-words representation of numeral */ - public function getInWordsInt($amount, $gender=RUtils::MALE) + public function getInWordsInt($amount, $gender = RUtils::MALE) { $amount = round($amount); return $this->sumString($amount, $gender); @@ -257,17 +279,19 @@ public function getInWordsFloat($amount) * @param int $signs * @return string */ - private function _getFloatRemainder($value, $signs=9) + private function _getFloatRemainder($value, $signs = 9) { - if ($value == (int)$value) + if ($value == (int)$value) { return '0'; + } $signs = min($signs, sizeof(self::$_FRACTIONS)); $value = number_format($value, $signs, '.', ''); list(, $remainder) = explode('.', $value); $remainder = preg_replace('/0+$/', '', $remainder); - if (!$remainder) + if (!$remainder) { $remainder = '0'; + } return $remainder; } @@ -279,25 +303,34 @@ private function _getFloatRemainder($value, $signs=9) * @return string In-words representation of money's amount * @throws \InvalidArgumentException */ - public function getRubles($amount, $zeroForKopeck=false) + public function getRubles($amount, $zeroForKopeck = false) { - if ($amount < 0) + if ($amount < 0) { throw new \InvalidArgumentException('Amount must be positive or 0'); + } $words = array(); $amount = round($amount, 2); $iAmount = (int)$amount; - if ($iAmount) - $words[] = $this->sumString((int)$amount, RUtils::MALE, - array('рубль', 'рубля', 'рублей')); + if ($iAmount) { + $words[] = $this->sumString( + (int)$amount, + RUtils::MALE, + array('рубль', 'рубля', 'рублей') + ); + } $remainder = $this->_getFloatRemainder($amount, 2); if ($remainder || $zeroForKopeck) { - if ($remainder < 10 && strlen($remainder) == 1) + if ($remainder < 10 && strlen($remainder) == 1) { $remainder *= 10; - $words[] = $this->sumString($remainder, RUtils::FEMALE, - array('копейка', 'копейки', 'копеек')); + } + $words[] = $this->sumString( + $remainder, + RUtils::FEMALE, + array('копейка', 'копейки', 'копеек') + ); } return trim(implode(' ', $words)); diff --git a/README.md b/README.md index 943e104..d9665b1 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ PHP RUtils ---------- [![Build Status](https://travis-ci.org/Andre-487/php_rutils.svg)](https://travis-ci.org/Andre-487/php_rutils) +[![Code Climate](https://codeclimate.com/github/Andre-487/php_rutils/badges/gpa.svg)](https://codeclimate.com/github/Andre-487/php_rutils) RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography) for PHP. This is a port of the Python [Pytils](https://github.com/j2a/pytils) to PHP. @@ -24,6 +25,10 @@ RUtils — порт утилит [Pytils](https://github.com/j2a/pytils) на PH Буду рад принять помощь по проекту в виде советов, баг-репортов и pull-реквестов. +Проект следует стилю кодирования [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md). +Стиль проверяется с помощью [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) +на этапе CI. + Хочу сказать большое спасибо [всем людям](https://github.com/Andre-487/php_rutils/graphs/contributors), внесшим свой вклад в улучшение проекта. diff --git a/RUtils.php b/RUtils.php index 678967a..13ed689 100644 --- a/RUtils.php +++ b/RUtils.php @@ -26,8 +26,9 @@ class RUtils */ public static function numeral() { - if (self::$_numeral === null) + if (self::$_numeral === null) { self::$_numeral = new Numeral(); + } return self::$_numeral; } @@ -37,8 +38,9 @@ public static function numeral() */ public static function dt() { - if (self::$_dt === null) + if (self::$_dt === null) { self::$_dt = new Dt(); + } return self::$_dt; } @@ -48,8 +50,9 @@ public static function dt() */ public static function translit() { - if (self::$_translit === null) + if (self::$_translit === null) { self::$_translit = new Translit(); + } return self::$_translit; } @@ -59,8 +62,9 @@ public static function translit() */ public static function typo() { - if (self::$_typo === null) + if (self::$_typo === null) { self::$_typo = new Typo(); + } return self::$_typo; } @@ -70,7 +74,7 @@ public static function typo() * @param int $decimals * @return string */ - public static function formatNumber($number, $decimals=0) + public static function formatNumber($number, $decimals = 0) { $number = number_format($number, $decimals, ',', ' '); return str_replace(' ', "\xE2\x80\x89", $number); diff --git a/Translit.php b/Translit.php index 4764b7c..830da49 100644 --- a/Translit.php +++ b/Translit.php @@ -17,46 +17,76 @@ class Translit array("“", '"'), array("”", '"'), array("№", "#"), - //Alphabet (ISO9 [ГОСТ 7.79—2000], Scheme B) //3-symbolic - array('Щ', 'Shh'), array('щ', 'shh'), - + array('Щ', 'Shh'), + array('щ', 'shh'), //2-symbolic - array('Ё', 'Yo'), array('ё', 'yo'), - array('Ж', 'Zh'), array('ж', 'zh'), - array('Ц', 'Cz'), array('ц', 'cz'), - array('Ч', 'Ch'), array('ч', 'ch'), - array('Ш', 'Sh'), array('ш', 'sh'), - array('ъ', '``'), array('Ъ', '``'), - array('Ы', 'Y`'), array('ы', 'y`'), - array('Э', 'E`'), array('э', 'e`'), - array('Ю', 'Yu'), array('ю', 'yu'), - array('Я', 'Ya'), array('я', 'ya'), - + array('Ё', 'Yo'), + array('ё', 'yo'), + array('Ж', 'Zh'), + array('ж', 'zh'), + array('Ц', 'Cz'), + array('ц', 'cz'), + array('Ч', 'Ch'), + array('ч', 'ch'), + array('Ш', 'Sh'), + array('ш', 'sh'), + array('ъ', '``'), + array('Ъ', '``'), + array('Ы', 'Y`'), + array('ы', 'y`'), + array('Э', 'E`'), + array('э', 'e`'), + array('Ю', 'Yu'), + array('ю', 'yu'), + array('Я', 'Ya'), + array('я', 'ya'), //1-symbolic - array('А', 'A'), array('а', 'a'), - array('Б', 'B'), array('б', 'b'), - array('В', 'V'), array('в', 'v'), - array('Г', 'G'), array('г', 'g'), - array('Д', 'D'), array('д', 'd'), - array('Е', 'E'), array('е', 'e'), - array('З', 'Z'), array('з', 'z'), - array('И', 'I'), array('и', 'i'), - array('Й', 'J'), array('й', 'j'), - array('К', 'K'), array('к', 'k'), - array('Л', 'L'), array('л', 'l'), - array('М', 'M'), array('м', 'm'), - array('Н', 'N'), array('н', 'n'), - array('О', 'O'), array('о', 'o'), - array('П', 'P'), array('п', 'p'), - array('Р', 'R'), array('р', 'r'), - array('С', 'S'), array('с', 's'), - array('Т', 'T'), array('т', 't'), - array('У', 'U'), array('у', 'u'), - array('Ф', 'F'), array('ф', 'f'), - array('Х', 'X'), array('х', 'x'), - array('ь', '`'), array('Ь', '`'), + array('А', 'A'), + array('а', 'a'), + array('Б', 'B'), + array('б', 'b'), + array('В', 'V'), + array('в', 'v'), + array('Г', 'G'), + array('г', 'g'), + array('Д', 'D'), + array('д', 'd'), + array('Е', 'E'), + array('е', 'e'), + array('З', 'Z'), + array('з', 'z'), + array('И', 'I'), + array('и', 'i'), + array('Й', 'J'), + array('й', 'j'), + array('К', 'K'), + array('к', 'k'), + array('Л', 'L'), + array('л', 'l'), + array('М', 'M'), + array('м', 'm'), + array('Н', 'N'), + array('н', 'n'), + array('О', 'O'), + array('о', 'o'), + array('П', 'P'), + array('п', 'p'), + array('Р', 'R'), + array('р', 'r'), + array('С', 'S'), + array('с', 's'), + array('Т', 'T'), + array('т', 't'), + array('У', 'U'), + array('у', 'u'), + array('Ф', 'F'), + array('ф', 'f'), + array('Х', 'X'), + array('х', 'x'), + array('ь', '`'), + array('Ь', '`'), ); //Translation table private static $_RU_ALPHABET; @@ -68,7 +98,7 @@ class Translit /** * "Constructor" for class variables */ - public static function StaticConstructor() + public static function staticConstructor() { self::$_RU_ALPHABET = array(); self::$_EN_ALPHABET = array(); @@ -108,7 +138,7 @@ public function detranslify($inString) public function slugify($inString) { //convert & to "and" - $inString = preg_replace('/(?:&)|&/u' , ' and ', $inString); + $inString = preg_replace('/(?:&)|&/u', ' and ', $inString); //replace spaces $inString = preg_replace('/[—−\-\s\t]+/u', '-', $inString); @@ -118,4 +148,4 @@ public function slugify($inString) } } -Translit::StaticConstructor(); +Translit::staticConstructor(); diff --git a/Typo.php b/Typo.php index 564ad92..c8ef489 100644 --- a/Typo.php +++ b/Typo.php @@ -24,7 +24,9 @@ class Typo //remove double spaces array('#[ ]+#um', ' '), ); - private static $_CLEAN_SPACES_PATTERN, $_CLEAN_SPACES_REPLACEMENT; + + private static $_CLEAN_SPACES_PATTERN; + private static $_CLEAN_SPACES_REPLACEMENT; //ELLIPSIS RULE private static $_ELLIPSIS_PATTERN = array( @@ -79,7 +81,9 @@ class Typo array('#(\w)\s+(®|™)#u', '$1$2'), array('#\s(no|№)\s*(\d+)#ui', "\xC2\xA0№\xE2\x80\x89$2"), ); - private static $_MARKS_PATTERN, $_MARKS_REPLACEMENT; + + private static $_MARKS_PATTERN; + private static $_MARKS_REPLACEMENT; //QUOTES RULE private static $_QUOTES_PATTERN = array( @@ -93,7 +97,7 @@ class Typo /** * "Constructor" for class variables */ - public static function StaticConstructor() + public static function staticConstructor() { self::$_CLEAN_SPACES_PATTERN = array(); self::$_CLEAN_SPACES_REPLACEMENT = array(); @@ -194,12 +198,14 @@ public static function rlQuotes($text) * @return string * @throws \InvalidArgumentException */ - public function typography($text, array $rules=null) + public function typography($text, array $rules = null) { - if ($rules === null) + if ($rules === null) { $rules = TypoRules::$STANDARD_RULES; - if (array_diff($rules, TypoRules::$EXTENDED_RULES)) + } + if (array_diff($rules, TypoRules::$EXTENDED_RULES)) { throw new \InvalidArgumentException('Invalid typo rules'); + } foreach ($rules as $rule) { $funcName = 'rl'.$rule; @@ -209,4 +215,4 @@ public function typography($text, array $rules=null) } } -Typo::StaticConstructor(); +Typo::staticConstructor(); diff --git a/TypoRules.php b/TypoRules.php index e9362ea..f4f1f09 100644 --- a/TypoRules.php +++ b/TypoRules.php @@ -33,6 +33,13 @@ class TypoRules public static $STANDARD_RULES = array(self::QUOTES, self::MARKS, self::DASHES, self::CLEAN_SPACES); //Standard rules: quotes, marks, word glue, dashes, initials, ellipsis, clean spaces - public static $EXTENDED_RULES = array(self::DASHES, self::QUOTES, self::MARKS, self::ELLIPSIS, - self::CLEAN_SPACES, self::INITIALS, self::WORD_GLUE,); + public static $EXTENDED_RULES = array( + self::DASHES, + self::QUOTES, + self::MARKS, + self::ELLIPSIS, + self::CLEAN_SPACES, + self::INITIALS, + self::WORD_GLUE, + ); } diff --git a/composer.json b/composer.json index 4a5a590..8f26714 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,8 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "~4.8", + "squizlabs/php_codesniffer": "~2.3" }, "autoload": { "psr-0": { diff --git a/doc/examples/_begin.php b/doc/examples/_begin.php index 451c5dd..cb7cdb3 100644 --- a/doc/examples/_begin.php +++ b/doc/examples/_begin.php @@ -5,15 +5,19 @@ define('CLI', php_sapi_name() == 'cli'); mb_internal_encoding('UTF-8'); -if (CLI == false) +if (CLI == false) { header('Content-type: text/plain; charset=UTF-8'); +} -spl_autoload_register(function($className) { - $classPath = LIB_DIR. DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php'; - if (is_file($classPath)) +spl_autoload_register( + function ($className) { + $classPath = LIB_DIR.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php'; + if (is_file($classPath)) { require_once $classPath; - else + } else { throw new \Exception("Wrong class path $classPath"); - }); + } + } +); ob_start(); diff --git a/doc/examples/_end.php b/doc/examples/_end.php index acebc43..b80efb4 100644 --- a/doc/examples/_end.php +++ b/doc/examples/_end.php @@ -2,6 +2,7 @@ namespace php_rutils\doc\examples; $content = ob_get_clean(); -if (CLI && strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') +if (CLI && strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $content = iconv('UTF-8', 'cp866//IGNORE', $content); +} echo $content, PHP_EOL; diff --git a/doc/quick-start.ru.html b/doc/quick-start.ru.html index 088b91e..9125f18 100644 --- a/doc/quick-start.ru.html +++ b/doc/quick-start.ru.html @@ -7,9 +7,10 @@

Quick start

+

PHP RUtils — порт Pytils на PHP. - Утилиты разделены на следующие модули (классы): + Утилиты разделены на следующие модули (классы):

  • Numeral - работа с числами,
  • @@ -62,6 +63,7 @@

    Вывод суммы денег в рублях

    Возможности Dt

    Сегодняшняя дата

    +

    Параметры передаются в качестве инстанса класса \php_rutils\struct\TimeParams, @@ -78,10 +80,12 @@

    Сегодняшняя дата

    Историческая дата

    +

    Параметры передаются в качестве массива, поля такие же как в классе TimeParams.

    +

    Дата передается как строка в свободном формате. Так же возможно передавать дату как Unix timestamp или как инстанс класса \DateTime. @@ -99,7 +103,9 @@

    Историческая дата

    Временной период до фиксированной даты в прошлом

    +

    Форматы времени для данной функции аналогичны форматам для ruStrFTime.

    +

    Параметр $accuracy отвечает за подробность информации.

    diff --git a/struct/TimeParams.php b/struct/TimeParams.php
    index 5636ddb..0f1867d 100644
    --- a/struct/TimeParams.php
    +++ b/struct/TimeParams.php
    @@ -51,14 +51,16 @@ class TimeParams
          * @param array|null $aParams
          * @return TimeParams
          */
    -    public static function create(array $aParams=null)
    +    public static function create(array $aParams = null)
         {
             $params = new self();
    -        if ($aParams === null)
    +        if ($aParams === null) {
                 return $params;
    +        }
     
    -        foreach ($aParams as $name => $value)
    +        foreach ($aParams as $name => $value) {
                 $params->$name = $value;
    +        }
     
             return $params;
         }
    diff --git a/test/DistanceOfTimeInWordsTest.php b/test/DistanceOfTimeInWordsTest.php
    index 15b8e67..dd745b6 100644
    --- a/test/DistanceOfTimeInWordsTest.php
    +++ b/test/DistanceOfTimeInWordsTest.php
    @@ -30,42 +30,42 @@ public function testAccuracyYear()
                 //past
                 date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад',
                 date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера',
    -            date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера',
    -            date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "месяц\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца\xC2\xA0назад",
    -            ($nowTime - 366*24*60*60) => "год\xC2\xA0назад",
    -            ($nowTime - 2*370*24*60*60) => "2 года\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60) => "10 лет\xC2\xA0назад",
    -
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60) => "2 минуты\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60) => "5 минут\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 60 * 60) => "час\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60 * 60) => "2 часа\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60 * 60) => "5 часов\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 24 * 60 * 60) => 'вчера',
    +            date('Y-m-d H:i:s', $nowTime - 2 * 24 * 60 * 60) => 'позавчера',
    +            date('Y-m-d H:i:s', $nowTime - 3 * 24 * 60 * 60) => "3 дня\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 8 * 24 * 60 * 60 - 1 * 60 * 60) => "8 дней\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 32 * 24 * 60 * 60) => "месяц\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 32 * 24 * 60 * 60) => "2 месяца\xC2\xA0назад",
    +            ($nowTime - 366 * 24 * 60 * 60) => "год\xC2\xA0назад",
    +            ($nowTime - 2 * 370 * 24 * 60 * 60) => "2 года\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60) => "10 лет\xC2\xA0назад",
                 //future
                 date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'),
                 date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 60 * 60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60 * 60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60 * 60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
                 date('Y-m-d H:i:s', $tomorrow) => 'завтра',
                 date('Y-m-d H:i:s', $afterTomorrow) => 'послезавтра',
    -            date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня",
    -            date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней",
    -            date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA0месяц",
    -            date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца",
    -            ($nowTime + 366*24*60*60) => "через\xC2\xA0год",
    -            ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года",
    -            ($nowTime + 10*370*24*60*60) => "через\xC2\xA010 лет",
    +            date('Y-m-d H:i:s', $nowTime + 3 * 24 * 60 * 60) => "через\xC2\xA03 дня",
    +            date('Y-m-d H:i:s', $nowTime + 8 * 24 * 60 * 60) => "через\xC2\xA08 дней",
    +            date('Y-m-d H:i:s', $nowTime + 32 * 24 * 60 * 60) => "через\xC2\xA0месяц",
    +            date('Y-m-d H:i:s', $nowTime + 2 * 32 * 24 * 60 * 60) => "через\xC2\xA02 месяца",
    +            ($nowTime + 366 * 24 * 60 * 60) => "через\xC2\xA0год",
    +            ($nowTime + 2 * 370 * 24 * 60 * 60) => "через\xC2\xA02 года",
    +            ($nowTime + 10 * 370 * 24 * 60 * 60) => "через\xC2\xA010 лет",
             );
     
    -        foreach ($testData as $toTime => $expected)
    +        foreach ($testData as $toTime => $expected) {
                 $this->assertEquals($expected, $this->_object->distanceOfTimeInWords($toTime));
    +        }
         }
     
         /**
    @@ -82,42 +82,45 @@ public function testAccuracyMonth()
                 //past
                 date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад',
                 date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера',
    -            date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера',
    -            date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "месяц\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца\xC2\xA0назад",
    -            ($nowTime - 366*24*60*60) => "год\xC2\xA0назад",
    -            ($nowTime - 2*370*24*60*60) => "2 года\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад",
    -
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60) => "2 минуты\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60) => "5 минут\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 60 * 60) => "час\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60 * 60) => "2 часа\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60 * 60) => "5 часов\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 24 * 60 * 60) => 'вчера',
    +            date('Y-m-d H:i:s', $nowTime - 2 * 24 * 60 * 60) => 'позавчера',
    +            date('Y-m-d H:i:s', $nowTime - 3 * 24 * 60 * 60) => "3 дня\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 8 * 24 * 60 * 60 - 1 * 60 * 60) => "8 дней\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 32 * 24 * 60 * 60) => "месяц\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 32 * 24 * 60 * 60) => "2 месяца\xC2\xA0назад",
    +            ($nowTime - 366 * 24 * 60 * 60) => "год\xC2\xA0назад",
    +            ($nowTime - 2 * 370 * 24 * 60 * 60) => "2 года\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60 + 2 * 24 * 60 * 60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад",
                 //future
                 date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'),
                 date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 60 * 60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60 * 60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60 * 60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
                 date('Y-m-d H:i:s', $tomorrow) => 'завтра',
                 date('Y-m-d H:i:s', $afterTomorrow) => 'послезавтра',
    -            date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня",
    -            date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней",
    -            date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA0месяц",
    -            date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца",
    -            ($nowTime + 366*24*60*60) => "через\xC2\xA0год",
    -            ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года",
    -            ($nowTime + 10*370*24*60*60 + 2*24*60*60 + 12) => "через\xC2\xA010 лет, %d месяц%S",
    +            date('Y-m-d H:i:s', $nowTime + 3 * 24 * 60 * 60) => "через\xC2\xA03 дня",
    +            date('Y-m-d H:i:s', $nowTime + 8 * 24 * 60 * 60) => "через\xC2\xA08 дней",
    +            date('Y-m-d H:i:s', $nowTime + 32 * 24 * 60 * 60) => "через\xC2\xA0месяц",
    +            date('Y-m-d H:i:s', $nowTime + 2 * 32 * 24 * 60 * 60) => "через\xC2\xA02 месяца",
    +            ($nowTime + 366 * 24 * 60 * 60) => "через\xC2\xA0год",
    +            ($nowTime + 2 * 370 * 24 * 60 * 60) => "через\xC2\xA02 года",
    +            ($nowTime + 10 * 370 * 24 * 60 * 60 + 2 * 24 * 60 * 60 + 12) => "через\xC2\xA010 лет, %d месяц%S",
             );
     
    -        foreach ($testData as $toTime => $format)
    -            $this->assertStringMatchesFormat($format, $this->_object->distanceOfTimeInWords($toTime, null, RUtils::ACCURACY_MONTH));
    +        foreach ($testData as $toTime => $format) {
    +            $this->assertStringMatchesFormat(
    +                $format,
    +                $this->_object->distanceOfTimeInWords($toTime, null, RUtils::ACCURACY_MONTH)
    +            );
    +        }
         }
     
         /**
    @@ -134,43 +137,46 @@ public function testAccuracyDay()
                 //past
                 date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад',
                 date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера',
    -            date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера',
    -            date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "1 месяц, %d д%s\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца, %d д%s\xC2\xA0назад",
    -            ($nowTime - 366*24*60*60) => "1 год, %d д%s\xC2\xA0назад",
    -            ($nowTime - 2*370*24*60*60 - 72*24*60*60 - 12*60) => "2 года, 2 месяца, %d д%s\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60 - 62*24*60*60) => "10 лет, %d месяц%s, %d д%s\xC2\xA0назад",
    -
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60) => "2 минуты\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60) => "5 минут\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 60 * 60) => "час\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60 * 60) => "2 часа\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60 * 60) => "5 часов\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 24 * 60 * 60) => 'вчера',
    +            date('Y-m-d H:i:s', $nowTime - 2 * 24 * 60 * 60) => 'позавчера',
    +            date('Y-m-d H:i:s', $nowTime - 3 * 24 * 60 * 60) => "3 дня\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 8 * 24 * 60 * 60 - 1 * 60 * 60) => "8 дней\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 32 * 24 * 60 * 60) => "1 месяц, %d д%s\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 32 * 24 * 60 * 60) => "2 месяца, %d д%s\xC2\xA0назад",
    +            ($nowTime - 366 * 24 * 60 * 60) => "1 год, %d д%s\xC2\xA0назад",
    +            ($nowTime - 2 * 370 * 24 * 60 * 60 - 72 * 24 * 60 * 60 - 12 * 60) => "2 года, 2 месяца, %d д%s\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60 + 2 * 24 * 60 * 60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60 - 62 * 24 * 60 * 60) => "10 лет, %d месяц%s, %d д%s\xC2\xA0назад",
                 //future
                 date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'),
                 date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 60 * 60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60 * 60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60 * 60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
                 date('Y-m-d H:i:s', $tomorrow) => 'завтра',
                 date('Y-m-d H:i:s', $afterTomorrow) => 'послезавтра',
    -            date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня",
    -            date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней",
    -            date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA01 месяц, %d д%s",
    -            date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца, %d д%s",
    -            ($nowTime + 367*24*60*60) => "через\xC2\xA01 год, %d д%s",
    -            ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года, %d д%s",
    -            ($nowTime + 10*370*24*60*60 + 65*24*60*60 + 12) => "через\xC2\xA010 лет, %d месяц%S, %d д%s",
    +            date('Y-m-d H:i:s', $nowTime + 3 * 24 * 60 * 60) => "через\xC2\xA03 дня",
    +            date('Y-m-d H:i:s', $nowTime + 8 * 24 * 60 * 60) => "через\xC2\xA08 дней",
    +            date('Y-m-d H:i:s', $nowTime + 32 * 24 * 60 * 60) => "через\xC2\xA01 месяц, %d д%s",
    +            date('Y-m-d H:i:s', $nowTime + 2 * 32 * 24 * 60 * 60) => "через\xC2\xA02 месяца, %d д%s",
    +            ($nowTime + 367 * 24 * 60 * 60) => "через\xC2\xA01 год, %d д%s",
    +            ($nowTime + 2 * 370 * 24 * 60 * 60) => "через\xC2\xA02 года, %d д%s",
    +            ($nowTime + 10 * 370 * 24 * 60 * 60 + 65 * 24 * 60 * 60 + 12) => "через\xC2\xA010 лет, %d месяц%S, %d д%s",
             );
     
    -        foreach ($testData as $toTime => $format)
    -            $this->assertStringMatchesFormat($format, $this->_object->distanceOfTimeInWords($toTime, null, RUtils::ACCURACY_DAY));
    +        foreach ($testData as $toTime => $format) {
    +            $this->assertStringMatchesFormat(
    +                $format,
    +                $this->_object->distanceOfTimeInWords($toTime, null, RUtils::ACCURACY_DAY)
    +            );
    +        }
         }
     
         /**
    @@ -186,42 +192,49 @@ public function testAccuracyMinute()
                 //past
                 date('Y-m-d H:i:s', $nowTime - 1) => 'менее минуты назад',
                 date('Y-m-d H:i:s', $nowTime - 60) => "минуту\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60) => "2 минуты\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60) => "5 минут\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 60*60) => "час\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*60*60) => "2 часа\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 5*60*60) => "5 часов\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 24*60*60) => 'вчера',
    -            date('Y-m-d H:i:s', $nowTime - 2*24*60*60) => 'позавчера',
    -            date('Y-m-d H:i:s', $nowTime - 3*24*60*60) => "3 дня\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 8*24*60*60 - 1*60*60) => "8 дней, 1 час\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 32*24*60*60) => "1 месяц, %d д%s\xC2\xA0назад",
    -            date('Y-m-d H:i:s', $nowTime - 2*32*24*60*60) => "2 месяца, %d д%s\xC2\xA0назад",
    -            ($nowTime - 366*24*60*60) => "1 год, %d д%s\xC2\xA0назад",
    -            ($nowTime - 2*370*24*60*60 - 72*24*60*60 - 12*60) => "2 года, 2 месяца, %d д%s\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60 + 2*24*60*60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60 - 62*24*60*60) => "10 лет, %d месяц%s, %d д%s\xC2\xA0назад",
    -            ($nowTime - 10*370*24*60*60 - 65*24*60*60 - 90*60) => "10 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S\xC2\xA0назад",
    -
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60) => "2 минуты\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60) => "5 минут\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 60 * 60) => "час\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 60 * 60) => "2 часа\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 5 * 60 * 60) => "5 часов\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 24 * 60 * 60) => 'вчера',
    +            date('Y-m-d H:i:s', $nowTime - 2 * 24 * 60 * 60) => 'позавчера',
    +            date('Y-m-d H:i:s', $nowTime - 3 * 24 * 60 * 60) => "3 дня\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 8 * 24 * 60 * 60 - 1 * 60 * 60) => "8 дней, 1 час\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 32 * 24 * 60 * 60) => "1 месяц, %d д%s\xC2\xA0назад",
    +            date('Y-m-d H:i:s', $nowTime - 2 * 32 * 24 * 60 * 60) => "2 месяца, %d д%s\xC2\xA0назад",
    +            ($nowTime - 366 * 24 * 60 * 60) => "1 год, %d д%s\xC2\xA0назад",
    +            ($nowTime - 2 * 370 * 24 * 60 * 60 - 72 * 24 * 60 * 60 - 12 * 60) => "2 года, 2 месяца, %d д%s\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60 + 2 * 24 * 60 * 60 + 12) => "10 лет, %d месяц%S\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60 - 62 * 24 * 60 * 60) => "10 лет, %d месяц%s, %d д%s\xC2\xA0назад",
    +            ($nowTime - 10 * 370 * 24 * 60 * 60 - 65 * 24 * 60 * 60 - 90 * 60) => "10 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S\xC2\xA0назад",
                 //future
                 date('Y-m-d H:i:s', $nowTime + 1) => ($dNowTomorrow >= 1 ? 'менее чем через минуту' : 'завтра'),
                 date('Y-m-d H:i:s', $nowTime + 60) => ($dNowTomorrow >= 60 ? "через\xC2\xA0минуту" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 60*60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 2*60*60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 5*60*60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
    -            date('Y-m-d H:i:s', $nowTime + 3*24*60*60) => "через\xC2\xA03 дня",
    -            date('Y-m-d H:i:s', $nowTime + 8*24*60*60) => "через\xC2\xA08 дней",
    -            date('Y-m-d H:i:s', $nowTime + 32*24*60*60) => "через\xC2\xA01 месяц, %d д%s",
    -            date('Y-m-d H:i:s', $nowTime + 2*32*24*60*60) => "через\xC2\xA02 месяца, %d д%s",
    -            ($nowTime + 367*24*60*60) => "через\xC2\xA01 год, %d д%s",
    -            ($nowTime + 2*370*24*60*60) => "через\xC2\xA02 года, %d д%s",
    -            ($nowTime + 10*370*24*60*60 + 65*24*60*60 + 90*60) => "через\xC2\xA010 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S",
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60) => ($dNowTomorrow >= 120 ? "через\xC2\xA02 минуты" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60) => ($dNowTomorrow >= 300 ? "через\xC2\xA05 минут" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 60 * 60) => ($dNowTomorrow >= 3600 ? "через\xC2\xA0час" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 2 * 60 * 60) => ($dNowTomorrow >= 7200 ? "через\xC2\xA02 часа" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 5 * 60 * 60) => ($dNowTomorrow >= 18000 ? "через\xC2\xA05 часов" : 'завтра'),
    +            date('Y-m-d H:i:s', $nowTime + 3 * 24 * 60 * 60) => "через\xC2\xA03 дня",
    +            date('Y-m-d H:i:s', $nowTime + 8 * 24 * 60 * 60) => "через\xC2\xA08 дней",
    +            date('Y-m-d H:i:s', $nowTime + 32 * 24 * 60 * 60) => "через\xC2\xA01 месяц, %d д%s",
    +            date('Y-m-d H:i:s', $nowTime + 2 * 32 * 24 * 60 * 60) => "через\xC2\xA02 месяца, %d д%s",
    +            ($nowTime + 367 * 24 * 60 * 60) => "через\xC2\xA01 год, %d д%s",
    +            ($nowTime + 2 * 370 * 24 * 60 * 60) => "через\xC2\xA02 года, %d д%s",
    +            ($nowTime + 10 * 370 * 24 * 60 * 60 + 65 * 24 * 60 * 60 + 90 * 60) => "через\xC2\xA010 лет, %d месяц%S, %d д%s, %d ч%s, %d минут%S",
             );
     
    -        foreach ($testData as $toTime => $format)
    -            $this->assertStringMatchesFormat($format, $this->_object->distanceOfTimeInWords($toTime, null, RUtils::ACCURACY_MINUTE));
    +        foreach ($testData as $toTime => $format) {
    +            $this->assertStringMatchesFormat(
    +                $format,
    +                $this->_object->distanceOfTimeInWords(
    +                    $toTime,
    +                    null,
    +                    RUtils::ACCURACY_MINUTE
    +                )
    +            );
    +        }
         }
     
         /**
    diff --git a/test/DtTest.php b/test/DtTest.php
    index 2a255d1..f30047f 100644
    --- a/test/DtTest.php
    +++ b/test/DtTest.php
    @@ -120,8 +120,7 @@ public function testGetAgeEmpty()
             try {
                 $this->_object->getAge($birthDate);
                 $this->fail('Empty date passed');
    -        }
    -        catch (\InvalidArgumentException $e) {
    +        } catch (\InvalidArgumentException $e) {
                 $this->assertEquals('Date/time is empty', $e->getMessage());
             }
         }
    @@ -135,8 +134,7 @@ public function testGetAgeIncorrectType()
             try {
                 $this->_object->getAge($birthDate);
                 $this->fail('Incorrect date passed');
    -        }
    -        catch (\InvalidArgumentException $e) {
    +        } catch (\InvalidArgumentException $e) {
                 $this->assertEquals('Incorrect date/time type', $e->getMessage());
             }
         }
    diff --git a/test/NumeralTest.php b/test/NumeralTest.php
    index 03e5102..a56b662 100644
    --- a/test/NumeralTest.php
    +++ b/test/NumeralTest.php
    @@ -46,8 +46,9 @@ public function testChoosePlural()
                 104 => 'гвоздя',
                 111 => 'гвоздей',
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->_assertChoosePlural($amount, $expected);
    +        }
         }
     
         private function _assertChoosePlural($amount, $expected)
    @@ -67,8 +68,9 @@ public function testGetPlural()
                 1104 => "1\xE2\x80\x89104 гвоздя",
                 1111 => "1\xE2\x80\x89111 гвоздей",
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->_assertGetPlural($amount, $expected);
    +        }
         }
     
         private function _assertGetPlural($amount, $expected)
    @@ -104,8 +106,9 @@ public function testSumStringMaleSuccess()
                 1102003 => 'один миллион сто две тысячи три гвоздя',
                 1100000001 => 'один миллиард сто миллионов один гвоздь',
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->assertEquals($expected, $this->_object->sumString($amount, RUtils::MALE, $variants));
    +        }
         }
     
         /**
    @@ -127,8 +130,9 @@ public function testSumStringFemaleSuccess()
                 1102003 => 'один миллион сто две тысячи три шляпки',
                 1100000001 => 'один миллиард сто миллионов одна шляпка',
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->assertEquals($expected, $this->_object->sumString($amount, RUtils::FEMALE, $variants));
    +        }
         }
     
         /**
    @@ -138,10 +142,9 @@ public function testSumStringRangeException()
         {
             $variants = array('гвоздь', 'гвоздя', 'гвоздей');
             try {
    -            var_dump($this->_object->sumString(PHP_INT_MAX+1, RUtils::MALE, $variants));
    +            $this->_object->sumString(PHP_INT_MAX + 1, RUtils::MALE, $variants);
                 $this->fail('No RangeException');
    -        }
    -        catch (\RangeException $e) {
    +        } catch (\RangeException $e) {
             }
         }
     
    @@ -168,8 +171,9 @@ public function testInWordsFloat()
                 '0.1' => 'ноль целых одна десятая',
                 '0.000000001' => 'ноль целых одна миллиардная',
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->assertEquals($expected, $this->_object->getInWordsFloat($amount));
    +        }
     
         }
     
    @@ -188,8 +192,9 @@ public function testInWordsGeneral()
                 '0.1' => 'ноль целых одна десятая',
                 '0.000000001' => 'ноль целых одна миллиардная',
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->assertEquals($expected, $this->_object->getInWords($amount, RUtils::FEMALE));
    +        }
         }
     
         /**
    @@ -204,7 +209,8 @@ public function testGetRubles()
                 '2.25' => 'два рубля двадцать пять копеек',
                 '0.01' => 'одна копейка',
             );
    -        foreach ($testData as $amount => $expected)
    +        foreach ($testData as $amount => $expected) {
                 $this->assertEquals($expected, $this->_object->getRubles($amount));
    +        }
         }
     }
    diff --git a/test/TranslitTest.php b/test/TranslitTest.php
    index 015c0fd..5501038 100644
    --- a/test/TranslitTest.php
    +++ b/test/TranslitTest.php
    @@ -31,8 +31,9 @@ public function testTranslify()
                 '‘Или вот так’' => "'Ili vot tak'",
                 'Двигатель “Pratt&Whitney”' => 'Dvigatel` "Pratt&Whitney"'
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->translify($testValue));
    +        }
         }
     
         /**
    @@ -49,8 +50,9 @@ public function testDetranslify()
                 '"Vot tak vot"' => '«Вот так вот»',
                 "'Ili vot tak'" => '‘Или вот так’',
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->detranslify($testValue));
    +        }
         }
     
         /**
    @@ -71,8 +73,9 @@ public function testSlugify()
                 '95−34' => '95-34',
                 'Эмгыр вар Эмрейс тоже хочет быть в slugify' => 'emgyr-var-emrejs-tozhe-xochet-byt-v-slugify',
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->slugify($testValue));
    +        }
         }
     
         /**
    diff --git a/test/TypoTest.php b/test/TypoTest.php
    index cb197db..0883313 100644
    --- a/test/TypoTest.php
    +++ b/test/TypoTest.php
    @@ -24,16 +24,17 @@ public function testRlCleanSpaces()
         {
             $testData = array(
                 " Точка ,точка , запятая, вышла рожица  кривая . "
    -                => "Точка, точка, запятая, вышла рожица кривая.",
    +            => "Точка, точка, запятая, вышла рожица кривая.",
                 " Точка ,точка , \nзапятая,\n вышла  рожица \n кривая . "
    -                => "Точка, точка,\nзапятая,\nвышла рожица\nкривая.",
    +            => "Точка, точка,\nзапятая,\nвышла рожица\nкривая.",
                 "Газета ( ее принес мальчишка утром ) всё еще лежала на столе."
    -                => "Газета (ее принес мальчишка утром) всё еще лежала на столе.",
    +            => "Газета (ее принес мальчишка утром) всё еще лежала на столе.",
                 "Газета, утром принесенная мальчишкой (\r это был сосед, подзарабатывающий летом\n )\r\n , всё еще лежала на столе."
    -                => "Газета, утром принесенная мальчишкой (это был сосед, подзарабатывающий летом), всё еще лежала на столе."
    +            => "Газета, утром принесенная мальчишкой (это был сосед, подзарабатывающий летом), всё еще лежала на столе."
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlCleanSpaces($testValue));
    +        }
         }
     
         /**
    @@ -46,8 +47,9 @@ public function testRlCleanEllipsis()
                 '...Дааааа' => '…Дааааа',
                 '... Дааааа' => '…Дааааа'
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlEllipsis($testValue));
    +        }
         }
     
         /**
    @@ -57,16 +59,17 @@ public function testRlInitials()
         {
             $testData = array(
                 'Председатель В.И.Иванов выступил на собрании'
    -                => "Председатель В.\xE2\x80\x89И.\xE2\x80\x89Иванов выступил на собрании",
    +            => "Председатель В.\xE2\x80\x89И.\xE2\x80\x89Иванов выступил на собрании",
                 'Председатель В.И. Иванов выступил на собрании'
    -                => "Председатель В.\xE2\x80\x89И.\xE2\x80\x89Иванов выступил на собрании",
    +            => "Председатель В.\xE2\x80\x89И.\xE2\x80\x89Иванов выступил на собрании",
                 "1. В.И.Иванов\r\n2. С.П.Васечкин"
    -                => "1. В.\xE2\x80\x89И.\xE2\x80\x89Иванов\r\n2. С.\xE2\x80\x89П.\xE2\x80\x89Васечкин",
    +            => "1. В.\xE2\x80\x89И.\xE2\x80\x89Иванов\r\n2. С.\xE2\x80\x89П.\xE2\x80\x89Васечкин",
                 "Председатель В.\r\nИ.\r\nИванов выступил на собрании"
    -                => "Председатель В.\xE2\x80\x89И.\xE2\x80\x89Иванов выступил на собрании",
    +            => "Председатель В.\xE2\x80\x89И.\xE2\x80\x89Иванов выступил на собрании",
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlInitials($testValue));
    +        }
         }
     
         /**
    @@ -76,19 +79,20 @@ public function testRlDashes()
         {
             $testData = array(
                 "- Я пошел домой...\n- Может останешься? - Нет, ухожу."
    -                => "—\xE2\x80\x89Я пошел домой...\n—\xE2\x80\x89Может останешься? —\xE2\x80\x89Нет, ухожу.",
    +            => "—\xE2\x80\x89Я пошел домой...\n—\xE2\x80\x89Может останешься? —\xE2\x80\x89Нет, ухожу.",
                 '-- Я пошел домой... -- Может останешься? -- Нет, ухожу.'
    -                => "—\xE2\x80\x89Я пошел домой... —\xE2\x80\x89Может останешься? —\xE2\x80\x89Нет, ухожу.",
    +            => "—\xE2\x80\x89Я пошел домой... —\xE2\x80\x89Может останешься? —\xE2\x80\x89Нет, ухожу.",
                 "-- Я\xC2\xA0пошел домой…\xC2\xA0-- Может останешься?\xC2\xA0-- Нет,\xC2\xA0ухожу."
    -                => "—\xE2\x80\x89Я\xC2\xA0пошел домой…\xC2\xA0—\xE2\x80\x89Может останешься?\xC2\xA0—\xE2\x80\x89Нет,\xC2\xA0ухожу.",
    +            => "—\xE2\x80\x89Я\xC2\xA0пошел домой…\xC2\xA0—\xE2\x80\x89Может останешься?\xC2\xA0—\xE2\x80\x89Нет,\xC2\xA0ухожу.",
                 'Муха - это маленькая птичка' => "Муха\xE2\x80\x89— это маленькая птичка",
                 'Муха--это маленькая птичка' => "Муха\xE2\x80\x89— это маленькая птичка",
                 'Ползать по-пластунски' => 'Ползать по-пластунски',
                 'Диапазон: 9 -  15' => 'Диапазон: 9—15',
                 'Температура: -1 - +2' => 'Температура: -1…+2'
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlDashes($testValue));
    +        }
         }
     
         /**
    @@ -101,10 +105,11 @@ public function testRlWordGlue()
                 'Он не поверил глазам' => "Он\xC2\xA0не\xC2\xA0поверил глазам",
                 'Муха — это маленькая птичка' => "Муха\xE2\x80\x89— это\xC2\xA0маленькая птичка",
                 'увидел в газете (это была "Сермяжная правда" № 45) рубрику Weather Forecast'
    -                => "увидел в\xC2\xA0газете (это\xC2\xA0была \"Сермяжная правда\" № 45) рубрику Weather Forecast"
    +            => "увидел в\xC2\xA0газете (это\xC2\xA0была \"Сермяжная правда\" № 45) рубрику Weather Forecast"
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlWordGlue($testValue));
    +        }
         }
     
         /**
    @@ -114,7 +119,7 @@ public function testRlMarks()
         {
             $testData = array(
                 'Когда В. И. Пупкин увидел в газете рубрику Weather Forecast (r), он не поверил своим глазам - температуру обещали +-451F.'
    -                => "Когда В. И. Пупкин увидел в газете рубрику Weather Forecast®, он не поверил своим глазам - температуру обещали ±451\xE2\x80\x89°F.",
    +            => "Когда В. И. Пупкин увидел в газете рубрику Weather Forecast®, он не поверил своим глазам - температуру обещали ±451\xE2\x80\x89°F.",
                 '14 Foo' => '14 Foo',
                 'Coca-cola(tm)' => 'Coca-cola™',
                 "(c)  2008\xE2\x80\x89Юрий Юревич" => "©\xE2\x80\x892008\xE2\x80\x89Юрий Юревич",
    @@ -123,8 +128,9 @@ public function testRlMarks()
                 'Школа-гимназия No3' => "Школа-гимназия\xC2\xA0№\xE2\x80\x893",
                 'Школа-гимназия №3' => "Школа-гимназия\xC2\xA0№\xE2\x80\x893",
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlMarks($testValue));
    +        }
         }
     
         /**
    @@ -137,12 +143,13 @@ public function testRlQuotes()
                 "\"МСК\xC2\xA0\"Аско-Забота\"" => "«МСК\xC2\xA0«Аско-Забота»",
                 "Двигатели 'Pratt&Whitney'" => "Двигатели “Pratt&Whitney”",
                 "\"Вложенные \"кавычки\" - бич всех типографик\", не правда ли"
    -                => "«Вложенные «кавычки» - бич всех типографик», не правда ли",
    +            => "«Вложенные «кавычки» - бич всех типографик», не правда ли",
                 "'Pratt&Whitney' никогда не использовались на самолетах \"Аэрофлота\""
    -                => "“Pratt&Whitney” никогда не использовались на самолетах «Аэрофлота»"
    +            => "“Pratt&Whitney” никогда не использовались на самолетах «Аэрофлота»"
             );
    -        foreach ($testData as $testValue => $expected)
    +        foreach ($testData as $testValue => $expected) {
                 $this->assertEquals($expected, $this->_object->rlQuotes($testValue));
    +        }
         }
     
         /**
    @@ -174,14 +181,14 @@ public function testTypographyExtended()
     ...Когда В. И. Пупкин увидел в газете ( это была "Сермяжная правда" № 45) рубрику Weather Forecast (r),
     он не поверил своим глазам - температуру обещали +-451F.
     TEXT;
    -            $text = preg_replace('#\r?\n#', "\n", $text);
    +        $text = preg_replace('#\r?\n#', "\n", $text);
     
    -            $expected = <<assertEquals($expected, $this->_object->typography($text, TypoRules::$EXTENDED_RULES));
    -        }
    +        $this->assertEquals($expected, $this->_object->typography($text, TypoRules::$EXTENDED_RULES));
    +    }
     }
    diff --git a/test/bootstrap.php b/test/bootstrap.php
    index 35293f4..aada41d 100644
    --- a/test/bootstrap.php
    +++ b/test/bootstrap.php
    @@ -6,8 +6,11 @@
     error_reporting(E_ALL | E_STRICT);
     mb_internal_encoding('UTF-8');
     
    -spl_autoload_register(function ($className) {
    -    $classPath = LIB_DIR.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php';
    -    if (is_file($classPath))
    -        require_once $classPath;
    -});
    +spl_autoload_register(
    +    function ($className) {
    +        $classPath = LIB_DIR.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php';
    +        if (is_file($classPath)) {
    +            require_once $classPath;
    +        }
    +    }
    +);
    
    From aecc99bc3c59529d3a69683b65c0ad449b7d596f Mon Sep 17 00:00:00 2001
    From: Andre-487 
    Date: Sat, 24 Oct 2015 20:19:27 +0300
    Subject: [PATCH 9/9] up version
    
    ---
     composer.json | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/composer.json b/composer.json
    index 8f26714..fa0b502 100644
    --- a/composer.json
    +++ b/composer.json
    @@ -1,7 +1,7 @@
     {
       "name": "andre_487/php_rutils",
       "description": "RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography)",
    -  "version": "1.1.1",
    +  "version": "1.2.0",
       "type": "library",
       "keywords": ["transliteration", "numeral is words", "russian dates", "typography"],
       "homepage": "https://github.com/Andre-487/php_rutils",