Browse Source

Renamed byte methods, moved path methods back to StringHelper

tags/2.0.0-beta
Alexander Makarov 11 years ago
parent
commit
26767735dc
  1. 6
      extensions/elasticsearch/ActiveRecord.php
  2. 12
      extensions/gii/generators/crud/templates/controller.php
  3. 8
      extensions/gii/generators/crud/templates/search.php
  4. 4
      extensions/gii/generators/crud/templates/views/_form.php
  5. 4
      extensions/gii/generators/crud/templates/views/_search.php
  6. 6
      extensions/gii/generators/crud/templates/views/create.php
  7. 8
      extensions/gii/generators/crud/templates/views/index.php
  8. 6
      extensions/gii/generators/crud/templates/views/update.php
  9. 6
      extensions/gii/generators/crud/templates/views/view.php
  10. 6
      extensions/gii/generators/module/Generator.php
  11. 5
      extensions/redis/ActiveRecord.php
  12. 6
      extensions/sphinx/ActiveRecord.php
  13. 2
      framework/yii/caching/Cache.php
  14. 4
      framework/yii/db/ActiveRecord.php
  15. 50
      framework/yii/helpers/BaseFileHelper.php
  16. 10
      framework/yii/helpers/BaseSecurity.php
  17. 46
      framework/yii/helpers/BaseStringHelper.php
  18. 4
      framework/yii/web/Response.php
  19. 4
      framework/yii/web/XmlResponseFormatter.php
  20. 61
      tests/unit/framework/helpers/StringHelperTest.php
  21. 2
      tests/unit/framework/web/ResponseTest.php

6
extensions/elasticsearch/ActiveRecord.php

@ -10,9 +10,9 @@ namespace yii\elasticsearch;
use yii\base\InvalidCallException; use yii\base\InvalidCallException;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\db\BaseActiveRecord; use yii\db\BaseActiveRecord;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\Json; use yii\helpers\Json;
use yii\helpers\StringHelper;
/** /**
* ActiveRecord is the base class for classes representing relational data in terms of objects. * ActiveRecord is the base class for classes representing relational data in terms of objects.
@ -226,7 +226,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function index() public static function index()
{ {
return Inflector::pluralize(Inflector::camel2id(FileHelper::basename(get_called_class()), '-')); return Inflector::pluralize(Inflector::camel2id(StringHelper::basename(get_called_class()), '-'));
} }
/** /**
@ -234,7 +234,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function type() public static function type()
{ {
return Inflector::camel2id(FileHelper::basename(get_called_class()), '-'); return Inflector::camel2id(StringHelper::basename(get_called_class()), '-');
} }
/** /**

12
extensions/gii/generators/crud/templates/controller.php

@ -1,7 +1,7 @@
<?php <?php
use yii\db\ActiveRecordInterface; use yii\db\ActiveRecordInterface;
use yii\helpers\FileHelper; use yii\helpers\StringHelper;
/** /**
* This is the template for generating a CRUD controller class file. * This is the template for generating a CRUD controller class file.
@ -10,9 +10,9 @@ use yii\helpers\FileHelper;
* @var yii\gii\generators\crud\Generator $generator * @var yii\gii\generators\crud\Generator $generator
*/ */
$controllerClass = FileHelper::basename($generator->controllerClass); $controllerClass = StringHelper::basename($generator->controllerClass);
$modelClass = FileHelper::basename($generator->modelClass); $modelClass = StringHelper::basename($generator->modelClass);
$searchModelClass = FileHelper::basename($generator->searchModelClass); $searchModelClass = StringHelper::basename($generator->searchModelClass);
if ($modelClass === $searchModelClass) { if ($modelClass === $searchModelClass) {
$searchModelAlias = $searchModelClass.'Search'; $searchModelAlias = $searchModelClass.'Search';
} }
@ -27,7 +27,7 @@ $actionParamComments = $generator->generateActionParamComments();
echo "<?php\n"; echo "<?php\n";
?> ?>
namespace <?= FileHelper::dirname(ltrim($generator->controllerClass, '\\')) ?>; namespace <?= StringHelper::dirname(ltrim($generator->controllerClass, '\\')) ?>;
use <?= ltrim($generator->modelClass, '\\') ?>; use <?= ltrim($generator->modelClass, '\\') ?>;
use <?= ltrim($generator->searchModelClass, '\\') ?><?php if (isset($searchModelAlias)):?> as <?= $searchModelAlias ?><?php endif ?>; use <?= ltrim($generator->searchModelClass, '\\') ?><?php if (isset($searchModelAlias)):?> as <?= $searchModelAlias ?><?php endif ?>;
@ -38,7 +38,7 @@ use yii\web\VerbFilter;
/** /**
* <?= $controllerClass ?> implements the CRUD actions for <?= $modelClass ?> model. * <?= $controllerClass ?> implements the CRUD actions for <?= $modelClass ?> model.
*/ */
class <?= $controllerClass ?> extends <?= FileHelper::basename($generator->baseControllerClass) . "\n" ?> class <?= $controllerClass ?> extends <?= StringHelper::basename($generator->baseControllerClass) . "\n" ?>
{ {
public function behaviors() public function behaviors()
{ {

8
extensions/gii/generators/crud/templates/search.php

@ -1,6 +1,6 @@
<?php <?php
use yii\helpers\FileHelper; use yii\helpers\StringHelper;
/** /**
* This is the template for generating a CRUD controller class file. * This is the template for generating a CRUD controller class file.
@ -9,8 +9,8 @@ use yii\helpers\FileHelper;
* @var yii\gii\generators\crud\Generator $generator * @var yii\gii\generators\crud\Generator $generator
*/ */
$modelClass = FileHelper::basename($generator->modelClass); $modelClass = StringHelper::basename($generator->modelClass);
$searchModelClass = FileHelper::basename($generator->searchModelClass); $searchModelClass = StringHelper::basename($generator->searchModelClass);
$rules = $generator->generateSearchRules(); $rules = $generator->generateSearchRules();
$labels = $generator->generateSearchLabels(); $labels = $generator->generateSearchLabels();
$searchAttributes = $generator->getSearchAttributes(); $searchAttributes = $generator->getSearchAttributes();
@ -19,7 +19,7 @@ $searchConditions = $generator->generateSearchConditions();
echo "<?php\n"; echo "<?php\n";
?> ?>
namespace <?= FileHelper::dirname(ltrim($generator->searchModelClass, '\\')) ?>; namespace <?= StringHelper::dirname(ltrim($generator->searchModelClass, '\\')) ?>;
use yii\base\Model; use yii\base\Model;
use yii\data\ActiveDataProvider; use yii\data\ActiveDataProvider;

4
extensions/gii/generators/crud/templates/views/_form.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
@ -28,7 +28,7 @@ use yii\widgets\ActiveForm;
*/ */
?> ?>
<div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-form"> <div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-form">
<?= "<?php " ?>$form = ActiveForm::begin(); ?> <?= "<?php " ?>$form = ActiveForm::begin(); ?>

4
extensions/gii/generators/crud/templates/views/_search.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
@ -21,7 +21,7 @@ use yii\widgets\ActiveForm;
*/ */
?> ?>
<div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-search"> <div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-search">
<?= "<?php " ?>$form = ActiveForm::begin([ <?= "<?php " ?>$form = ActiveForm::begin([
'action' => ['index'], 'action' => ['index'],

6
extensions/gii/generators/crud/templates/views/create.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
@ -18,11 +18,11 @@ use yii\helpers\Html;
* @var <?= ltrim($generator->modelClass, '\\') ?> $model * @var <?= ltrim($generator->modelClass, '\\') ?> $model
*/ */
$this->title = 'Create <?= Inflector::camel2words(FileHelper::basename($generator->modelClass)) ?>'; $this->title = 'Create <?= Inflector::camel2words(StringHelper::basename($generator->modelClass)) ?>';
$this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(BaseFileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(BaseFileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
?> ?>
<div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-create"> <div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-create">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>

8
extensions/gii/generators/crud/templates/views/index.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
@ -23,17 +23,17 @@ use <?= $generator->indexWidgetType === 'grid' ? "yii\\grid\\GridView" : "yii\\w
* @var <?= ltrim($generator->searchModelClass, '\\') ?> $searchModel * @var <?= ltrim($generator->searchModelClass, '\\') ?> $searchModel
*/ */
$this->title = '<?= Inflector::pluralize(Inflector::camel2words(FileHelper::basename($generator->modelClass))) ?>'; $this->title = '<?= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>';
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
?> ?>
<div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-index"> <div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-index">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
<?= "<?php " . ($generator->indexWidgetType === 'grid' ? "// " : "") ?>echo $this->render('_search', ['model' => $searchModel]); ?> <?= "<?php " . ($generator->indexWidgetType === 'grid' ? "// " : "") ?>echo $this->render('_search', ['model' => $searchModel]); ?>
<p> <p>
<?= "<?= " ?>Html::a('Create <?= FileHelper::basename($generator->modelClass) ?>', ['create'], ['class' => 'btn btn-success']) ?> <?= "<?= " ?>Html::a('Create <?= StringHelper::basename($generator->modelClass) ?>', ['create'], ['class' => 'btn btn-success']) ?>
</p> </p>
<?php if ($generator->indexWidgetType === 'grid'): ?> <?php if ($generator->indexWidgetType === 'grid'): ?>

6
extensions/gii/generators/crud/templates/views/update.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
@ -20,12 +20,12 @@ use yii\helpers\Html;
* @var <?= ltrim($generator->modelClass, '\\') ?> $model * @var <?= ltrim($generator->modelClass, '\\') ?> $model
*/ */
$this->title = 'Update <?= Inflector::camel2words(FileHelper::basename($generator->modelClass)) ?>: ' . $model-><?= $generator->getNameAttribute() ?>; $this->title = 'Update <?= Inflector::camel2words(StringHelper::basename($generator->modelClass)) ?>: ' . $model-><?= $generator->getNameAttribute() ?>;
$this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(BaseFileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(BaseFileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model-><?= $generator->getNameAttribute() ?>, 'url' => ['view', <?= $urlParams ?>]]; $this->params['breadcrumbs'][] = ['label' => $model-><?= $generator->getNameAttribute() ?>, 'url' => ['view', <?= $urlParams ?>]];
$this->params['breadcrumbs'][] = 'Update'; $this->params['breadcrumbs'][] = 'Update';
?> ?>
<div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-update"> <div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-update">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>

6
extensions/gii/generators/crud/templates/views/view.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
@ -22,10 +22,10 @@ use yii\widgets\DetailView;
*/ */
$this->title = $model-><?= $generator->getNameAttribute() ?>; $this->title = $model-><?= $generator->getNameAttribute() ?>;
$this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(FileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
?> ?>
<div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-view"> <div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-view">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>

6
extensions/gii/generators/module/Generator.php

@ -7,10 +7,10 @@
namespace yii\gii\generators\module; namespace yii\gii\generators\module;
use Yii;
use yii\gii\CodeFile; use yii\gii\CodeFile;
use yii\helpers\Html; use yii\helpers\Html;
use yii\helpers\FileHelper; use Yii;
use yii\helpers\StringHelper;
/** /**
* This generator will generate the skeleton code needed by a module. * This generator will generate the skeleton code needed by a module.
@ -119,7 +119,7 @@ EOD;
$files = []; $files = [];
$modulePath = $this->getModulePath(); $modulePath = $this->getModulePath();
$files[] = new CodeFile( $files[] = new CodeFile(
$modulePath . '/' . FileHelper::basename($this->moduleClass) . '.php', $modulePath . '/' . StringHelper::basename($this->moduleClass) . '.php',
$this->render("module.php") $this->render("module.php")
); );
$files[] = new CodeFile( $files[] = new CodeFile(

5
extensions/redis/ActiveRecord.php

@ -9,7 +9,6 @@ namespace yii\redis;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\db\BaseActiveRecord; use yii\db\BaseActiveRecord;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper; use yii\helpers\StringHelper;
@ -97,7 +96,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function keyPrefix() public static function keyPrefix()
{ {
return Inflector::camel2id(FileHelper::basename(get_called_class()), '_'); return Inflector::camel2id(StringHelper::basename(get_called_class()), '_');
} }
/** /**
@ -288,7 +287,7 @@ class ActiveRecord extends BaseActiveRecord
if (is_numeric($key)) { if (is_numeric($key)) {
return $key; return $key;
} elseif (is_string($key)) { } elseif (is_string($key)) {
return ctype_alnum($key) && StringHelper::byteLen($key) <= 32 ? $key : md5($key); return ctype_alnum($key) && StringHelper::byteLength($key) <= 32 ? $key : md5($key);
} elseif (is_array($key)) { } elseif (is_array($key)) {
if (count($key) == 1) { if (count($key) == 1) {
return self::buildKey(reset($key)); return self::buildKey(reset($key));

6
extensions/sphinx/ActiveRecord.php

@ -8,13 +8,13 @@
namespace yii\sphinx; namespace yii\sphinx;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\db\BaseActiveRecord;
use yii\base\NotSupportedException; use yii\base\NotSupportedException;
use yii\db\ActiveRelationInterface; use yii\db\ActiveRelationInterface;
use yii\db\BaseActiveRecord;
use yii\db\StaleObjectException; use yii\db\StaleObjectException;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use Yii; use Yii;
use yii\helpers\StringHelper;
/** /**
* ActiveRecord is the base class for classes representing relational data in terms of objects. * ActiveRecord is the base class for classes representing relational data in terms of objects.
@ -166,7 +166,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/ */
public static function indexName() public static function indexName()
{ {
return Inflector::camel2id(FileHelper::basename(get_called_class()), '_'); return Inflector::camel2id(StringHelper::basename(get_called_class()), '_');
} }
/** /**

2
framework/yii/caching/Cache.php

@ -100,7 +100,7 @@ abstract class Cache extends Component implements \ArrayAccess
protected function buildKey($key) protected function buildKey($key)
{ {
if (is_string($key)) { if (is_string($key)) {
$key = ctype_alnum($key) && StringHelper::byteLen($key) <= 32 ? $key : md5($key); $key = ctype_alnum($key) && StringHelper::byteLength($key) <= 32 ? $key : md5($key);
} else { } else {
$key = md5(json_encode($key)); $key = md5(json_encode($key));
} }

4
framework/yii/db/ActiveRecord.php

@ -9,8 +9,8 @@
namespace yii\db; namespace yii\db;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* ActiveRecord is the base class for classes representing relational data in terms of objects. * ActiveRecord is the base class for classes representing relational data in terms of objects.
@ -169,7 +169,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function tableName() public static function tableName()
{ {
return 'tbl_' . Inflector::camel2id(FileHelper::basename(get_called_class()), '_'); return 'tbl_' . Inflector::camel2id(StringHelper::basename(get_called_class()), '_');
} }
/** /**

50
framework/yii/helpers/BaseFileHelper.php

@ -292,11 +292,11 @@ class BaseFileHelper
if ($isDir = is_dir($path)) { if ($isDir = is_dir($path)) {
$path .= '/'; $path .= '/';
} }
$n = StringHelper::byteLen($path); $n = StringHelper::byteLength($path);
if (!empty($options['except'])) { if (!empty($options['except'])) {
foreach ($options['except'] as $name) { foreach ($options['except'] as $name) {
if (StringHelper::byteSubstr($path, -StringHelper::byteLen($name), $n) === $name) { if (StringHelper::byteSubstr($path, -StringHelper::byteLength($name), $n) === $name) {
return false; return false;
} }
} }
@ -304,7 +304,7 @@ class BaseFileHelper
if (!$isDir && !empty($options['only'])) { if (!$isDir && !empty($options['only'])) {
foreach ($options['only'] as $name) { foreach ($options['only'] as $name) {
if (StringHelper::byteSubstr($path, -StringHelper::byteLen($name), $n) === $name) { if (StringHelper::byteSubstr($path, -StringHelper::byteLength($name), $n) === $name) {
return true; return true;
} }
} }
@ -338,48 +338,4 @@ class BaseFileHelper
chmod($path, $mode); chmod($path, $mode);
return $result; return $result;
} }
/**
* Returns the trailing name component of a path.
* This method is similar to the php function `basename()` except that it will
* treat both \ and / as directory separators, independent of the operating system.
* This method was mainly created to work on php namespaces. When working with real
* file paths, php's `basename()` should work fine for you.
* Note: this method is not aware of the actual filesystem, or path components such as "..".
*
* @param string $path A path string.
* @param string $suffix If the name component ends in suffix this will also be cut off.
* @return string the trailing name component of the given path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function basename($path, $suffix = '')
{
if (($len = mb_strlen($suffix)) > 0 && mb_substr($path, -$len) == $suffix) {
$path = mb_substr($path, 0, -$len);
}
$path = rtrim(str_replace('\\', '/', $path), '/\\');
if (($pos = mb_strrpos($path, '/')) !== false) {
return mb_substr($path, $pos + 1);
}
return $path;
}
/**
* Returns parent directory's path.
* This method is similar to `dirname()` except that it will treat
* both \ and / as directory separators, independent of the operating system.
*
* @param string $path A path string.
* @return string the parent directory's path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function dirname($path)
{
$pos = mb_strrpos(str_replace('\\', '/', $path), '/');
if ($pos !== false) {
return mb_substr($path, 0, $pos);
} else {
return $path;
}
}
} }

10
framework/yii/helpers/BaseSecurity.php

@ -83,7 +83,7 @@ class BaseSecurity
$iv = StringHelper::byteSubstr($data, 0, $ivSize); $iv = StringHelper::byteSubstr($data, 0, $ivSize);
$key = static::deriveKey($password, $iv); $key = static::deriveKey($password, $iv);
mcrypt_generic_init($module, $key, $iv); mcrypt_generic_init($module, $key, $iv);
$decrypted = mdecrypt_generic($module, StringHelper::byteSubstr($data, $ivSize, StringHelper::byteLen($data))); $decrypted = mdecrypt_generic($module, StringHelper::byteSubstr($data, $ivSize, StringHelper::byteLength($data)));
mcrypt_generic_deinit($module); mcrypt_generic_deinit($module);
mcrypt_module_close($module); mcrypt_module_close($module);
return static::stripPadding($decrypted); return static::stripPadding($decrypted);
@ -96,7 +96,7 @@ class BaseSecurity
*/ */
protected static function addPadding($data) protected static function addPadding($data)
{ {
$pad = self::CRYPT_BLOCK_SIZE - (StringHelper::byteLen($data) % self::CRYPT_BLOCK_SIZE); $pad = self::CRYPT_BLOCK_SIZE - (StringHelper::byteLength($data) % self::CRYPT_BLOCK_SIZE);
return $data . str_repeat(chr($pad), $pad); return $data . str_repeat(chr($pad), $pad);
} }
@ -109,7 +109,7 @@ class BaseSecurity
{ {
$end = StringHelper::byteSubstr($data, -1, NULL); $end = StringHelper::byteSubstr($data, -1, NULL);
$last = ord($end); $last = ord($end);
$n = StringHelper::byteLen($data) - $last; $n = StringHelper::byteLength($data) - $last;
if (StringHelper::byteSubstr($data, $n, NULL) == str_repeat($end, $last)) { if (StringHelper::byteSubstr($data, $n, NULL) == str_repeat($end, $last)) {
return StringHelper::byteSubstr($data, 0, $n); return StringHelper::byteSubstr($data, 0, $n);
} }
@ -164,8 +164,8 @@ class BaseSecurity
*/ */
public static function validateData($data, $key, $algorithm = 'sha256') public static function validateData($data, $key, $algorithm = 'sha256')
{ {
$hashSize = StringHelper::byteLen(hash_hmac($algorithm, 'test', $key)); $hashSize = StringHelper::byteLength(hash_hmac($algorithm, 'test', $key));
$n = StringHelper::byteLen($data); $n = StringHelper::byteLength($data);
if ($n >= $hashSize) { if ($n >= $hashSize) {
$hash = StringHelper::byteSubstr($data, 0, $hashSize); $hash = StringHelper::byteSubstr($data, 0, $hashSize);
$data2 = StringHelper::byteSubstr($data, $hashSize, $n - $hashSize); $data2 = StringHelper::byteSubstr($data, $hashSize, $n - $hashSize);

46
framework/yii/helpers/BaseStringHelper.php

@ -26,7 +26,7 @@ class BaseStringHelper
* @param string $string the string being measured for length * @param string $string the string being measured for length
* @return integer the number of bytes in the given string. * @return integer the number of bytes in the given string.
*/ */
public static function byteLen($string) public static function byteLength($string)
{ {
return mb_strlen($string, '8bit'); return mb_strlen($string, '8bit');
} }
@ -94,4 +94,48 @@ class BaseStringHelper
$diff = new \Diff($lines1, $lines2); $diff = new \Diff($lines1, $lines2);
return $diff->render($renderer); return $diff->render($renderer);
} }
/**
* Returns the trailing name component of a path.
* This method is similar to the php function `basename()` except that it will
* treat both \ and / as directory separators, independent of the operating system.
* This method was mainly created to work on php namespaces. When working with real
* file paths, php's `basename()` should work fine for you.
* Note: this method is not aware of the actual filesystem, or path components such as "..".
*
* @param string $path A path string.
* @param string $suffix If the name component ends in suffix this will also be cut off.
* @return string the trailing name component of the given path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function basename($path, $suffix = '')
{
if (($len = mb_strlen($suffix)) > 0 && mb_substr($path, -$len) == $suffix) {
$path = mb_substr($path, 0, -$len);
}
$path = rtrim(str_replace('\\', '/', $path), '/\\');
if (($pos = mb_strrpos($path, '/')) !== false) {
return mb_substr($path, $pos + 1);
}
return $path;
}
/**
* Returns parent directory's path.
* This method is similar to `dirname()` except that it will treat
* both \ and / as directory separators, independent of the operating system.
*
* @param string $path A path string.
* @return string the parent directory's path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function dirname($path)
{
$pos = mb_strrpos(str_replace('\\', '/', $path), '/');
if ($pos !== false) {
return mb_substr($path, 0, $pos);
} else {
return $path;
}
}
} }

4
framework/yii/web/Response.php

@ -382,7 +382,7 @@ class Response extends \yii\base\Response
public function sendContentAsFile($content, $attachmentName, $mimeType = 'application/octet-stream') public function sendContentAsFile($content, $attachmentName, $mimeType = 'application/octet-stream')
{ {
$headers = $this->getHeaders(); $headers = $this->getHeaders();
$contentLength = StringHelper::byteLen($content); $contentLength = StringHelper::byteLength($content);
$range = $this->getHttpRange($contentLength); $range = $this->getHttpRange($contentLength);
if ($range === false) { if ($range === false) {
$headers->set('Content-Range', "bytes */$contentLength"); $headers->set('Content-Range', "bytes */$contentLength");
@ -395,7 +395,7 @@ class Response extends \yii\base\Response
->setDefault('Content-Type', $mimeType) ->setDefault('Content-Type', $mimeType)
->setDefault('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->setDefault('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->setDefault('Content-Transfer-Encoding', 'binary') ->setDefault('Content-Transfer-Encoding', 'binary')
->setDefault('Content-Length', StringHelper::byteLen($content)) ->setDefault('Content-Length', StringHelper::byteLength($content))
->setDefault('Content-Disposition', "attachment; filename=\"$attachmentName\""); ->setDefault('Content-Disposition', "attachment; filename=\"$attachmentName\"");
list($begin, $end) = $range; list($begin, $end) = $range;

4
framework/yii/web/XmlResponseFormatter.php

@ -12,7 +12,7 @@ use DOMElement;
use DOMText; use DOMText;
use yii\base\Arrayable; use yii\base\Arrayable;
use yii\base\Component; use yii\base\Component;
use yii\helpers\FileHelper; use yii\helpers\StringHelper;
/** /**
* XmlResponseFormatter formats the given data into an XML response content. * XmlResponseFormatter formats the given data into an XML response content.
@ -66,7 +66,7 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa
protected function buildXml($element, $data) protected function buildXml($element, $data)
{ {
if (is_object($data)) { if (is_object($data)) {
$child = new DOMElement(FileHelper::basename(get_class($data))); $child = new DOMElement(StringHelper::basename(get_class($data)));
$element->appendChild($child); $element->appendChild($child);
if ($data instanceof Arrayable) { if ($data instanceof Arrayable) {
$this->buildXml($child, $data->toArray()); $this->buildXml($child, $data->toArray());

61
tests/unit/framework/helpers/StringHelperTest.php

@ -1,7 +1,6 @@
<?php <?php
namespace yiiunit\framework\helpers; namespace yiiunit\framework\helpers;
use yii\helpers\FileHelper;
use yii\helpers\StringHelper; use yii\helpers\StringHelper;
use yiiunit\TestCase; use yiiunit\TestCase;
@ -13,8 +12,8 @@ class StringHelperTest extends TestCase
{ {
public function testStrlen() public function testStrlen()
{ {
$this->assertEquals(4, StringHelper::byteLen('this')); $this->assertEquals(4, StringHelper::byteLength('this'));
$this->assertEquals(6, StringHelper::byteLen('это')); $this->assertEquals(6, StringHelper::byteLength('это'));
} }
public function testSubstr() public function testSubstr()
@ -25,45 +24,45 @@ class StringHelperTest extends TestCase
public function testBasename() public function testBasename()
{ {
$this->assertEquals('', FileHelper::basename('')); $this->assertEquals('', StringHelper::basename(''));
$this->assertEquals('file', FileHelper::basename('file')); $this->assertEquals('file', StringHelper::basename('file'));
$this->assertEquals('file.test', FileHelper::basename('file.test', '.test2')); $this->assertEquals('file.test', StringHelper::basename('file.test', '.test2'));
$this->assertEquals('file', FileHelper::basename('file.test', '.test')); $this->assertEquals('file', StringHelper::basename('file.test', '.test'));
$this->assertEquals('file', FileHelper::basename('/file')); $this->assertEquals('file', StringHelper::basename('/file'));
$this->assertEquals('file.test', FileHelper::basename('/file.test', '.test2')); $this->assertEquals('file.test', StringHelper::basename('/file.test', '.test2'));
$this->assertEquals('file', FileHelper::basename('/file.test', '.test')); $this->assertEquals('file', StringHelper::basename('/file.test', '.test'));
$this->assertEquals('file', FileHelper::basename('/path/to/file')); $this->assertEquals('file', StringHelper::basename('/path/to/file'));
$this->assertEquals('file.test', FileHelper::basename('/path/to/file.test', '.test2')); $this->assertEquals('file.test', StringHelper::basename('/path/to/file.test', '.test2'));
$this->assertEquals('file', FileHelper::basename('/path/to/file.test', '.test')); $this->assertEquals('file', StringHelper::basename('/path/to/file.test', '.test'));
$this->assertEquals('file', FileHelper::basename('\file')); $this->assertEquals('file', StringHelper::basename('\file'));
$this->assertEquals('file.test', FileHelper::basename('\file.test', '.test2')); $this->assertEquals('file.test', StringHelper::basename('\file.test', '.test2'));
$this->assertEquals('file', FileHelper::basename('\file.test', '.test')); $this->assertEquals('file', StringHelper::basename('\file.test', '.test'));
$this->assertEquals('file', FileHelper::basename('C:\file')); $this->assertEquals('file', StringHelper::basename('C:\file'));
$this->assertEquals('file.test', FileHelper::basename('C:\file.test', '.test2')); $this->assertEquals('file.test', StringHelper::basename('C:\file.test', '.test2'));
$this->assertEquals('file', FileHelper::basename('C:\file.test', '.test')); $this->assertEquals('file', StringHelper::basename('C:\file.test', '.test'));
$this->assertEquals('file', FileHelper::basename('C:\path\to\file')); $this->assertEquals('file', StringHelper::basename('C:\path\to\file'));
$this->assertEquals('file.test', FileHelper::basename('C:\path\to\file.test', '.test2')); $this->assertEquals('file.test', StringHelper::basename('C:\path\to\file.test', '.test2'));
$this->assertEquals('file', FileHelper::basename('C:\path\to\file.test', '.test')); $this->assertEquals('file', StringHelper::basename('C:\path\to\file.test', '.test'));
// mixed paths // mixed paths
$this->assertEquals('file.test', FileHelper::basename('/path\to/file.test')); $this->assertEquals('file.test', StringHelper::basename('/path\to/file.test'));
$this->assertEquals('file.test', FileHelper::basename('/path/to\file.test')); $this->assertEquals('file.test', StringHelper::basename('/path/to\file.test'));
$this->assertEquals('file.test', FileHelper::basename('\path/to\file.test')); $this->assertEquals('file.test', StringHelper::basename('\path/to\file.test'));
// \ and / in suffix // \ and / in suffix
$this->assertEquals('file', FileHelper::basename('/path/to/filete/st', 'te/st')); $this->assertEquals('file', StringHelper::basename('/path/to/filete/st', 'te/st'));
$this->assertEquals('st', FileHelper::basename('/path/to/filete/st', 'te\st')); $this->assertEquals('st', StringHelper::basename('/path/to/filete/st', 'te\st'));
$this->assertEquals('file', FileHelper::basename('/path/to/filete\st', 'te\st')); $this->assertEquals('file', StringHelper::basename('/path/to/filete\st', 'te\st'));
$this->assertEquals('st', FileHelper::basename('/path/to/filete\st', 'te/st')); $this->assertEquals('st', StringHelper::basename('/path/to/filete\st', 'te/st'));
// http://www.php.net/manual/en/function.basename.php#72254 // http://www.php.net/manual/en/function.basename.php#72254
$this->assertEquals('foo', FileHelper::basename('/bar/foo/')); $this->assertEquals('foo', StringHelper::basename('/bar/foo/'));
$this->assertEquals('foo', FileHelper::basename('\\bar\\foo\\')); $this->assertEquals('foo', StringHelper::basename('\\bar\\foo\\'));
} }
} }

2
tests/unit/framework/web/ResponseTest.php

@ -57,7 +57,7 @@ class ResponseTest extends \yiiunit\TestCase
$this->assertEquals(206, $this->response->statusCode); $this->assertEquals(206, $this->response->statusCode);
$headers = $this->response->headers; $headers = $this->response->headers;
$this->assertEquals("bytes", $headers->get('Accept-Ranges')); $this->assertEquals("bytes", $headers->get('Accept-Ranges'));
$this->assertEquals("bytes " . $expectedHeader . '/' . StringHelper::byteLen($fullContent), $headers->get('Content-Range')); $this->assertEquals("bytes " . $expectedHeader . '/' . StringHelper::byteLength($fullContent), $headers->get('Content-Range'));
$this->assertEquals('text/plain', $headers->get('Content-Type')); $this->assertEquals('text/plain', $headers->get('Content-Type'));
$this->assertEquals("$length", $headers->get('Content-Length')); $this->assertEquals("$length", $headers->get('Content-Length'));
} }

Loading…
Cancel
Save