Skip to content
This repository has been archived by the owner on Jan 29, 2020. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Jean Carlo Machado committed May 17, 2014
183 parents fa6c937 + a4efcfe + 26ea7ff + 44bad20 + 47ff527 + 33b5707 + 0f253b5 + 644d22a + f3cba00 + e470732 + ae8cd95 + a4f21b6 + f36ff90 + 5344247 + 5cdfa08 + 4925e55 + fb107e5 + 98634df + 8d23ab7 + 19e17a6 + 98ac67f + 0a2d51c + 86db540 + efbb513 + 24c143c + 307427e + 4c7a822 + 25d3bd7 + 40bfe7f + 70ca2ff + 76fd684 + 82cff31 + 186a39c + 39a35fe + b0c8193 + 1a7e426 + 09ea754 + 8317963 + 950705c + bd78289 + 25f3e05 + 1c0577b + 6bcfccb + 0b2a1a9 + 7974490 + f3ba45e + 4357e80 + 7d43d02 + 421a0f4 + e7aa329 + 6d05bfe + f27c5e2 + 6cb3b21 + 1ecb5ed + b66b0e2 + 0b91e40 + 6bda391 + b932fa5 + a431b75 + 9ce83ec + a35dff6 + 60e4965 + 0f071e9 + 3fe17b4 + 196ca18 + 17cbc64 + 8f4a51f + 88ec12d + 31ab35e + 59c83c4 + d50da4c + 01af50b + 6a46af5 + 4308adc + 1c3d629 + 18a268d + 1987408 + abc72db + 175f7ab + 8a85704 + 7706019 + cc5d38c + fbaa5aa + 0555415 + 20ae04b + 0680687 + e65301c + 424e30a + d36a7f1 + 64bb794 + c74649b + b14bb6b + 4e73e4e + 0ee93d0 + e887bfd + f66ad20 + 66c5ff2 + f5b2841 + 717175b + 52c5e49 + 8f39d69 + 2003fce + 1ccb3fd + 315a9ac + 2b82c0f + 1565409 + fd7399e + cb27129 + 62ca6c9 + 7b73995 + 18f93e0 + 72fe59b + 9f5b116 + 28a04a3 + b56ee4d + 9287e61 + 1a420ec + 6a43cc1 + ad11b96 + cf95523 + 25ef603 + 894f762 + c00c005 + 69fb7fc + 57cb4a0 + e25b09c + 17a7c5c + c526cd4 + 518ca6f + 57fa76c + 853c28f + 520cebc + dc5f609 + ccf1c7e + 251b79e + 78fbb55 + fcc04e7 + 9bf2948 + 9561532 + b614ad3 + 954a3b1 + dacc257 + 07a262d + 59c02c3 + 7064caa + 6f75739 + 747b7ed + eb24d30 + 8ff8298 + 97c61d8 + da4af46 + 11c9caf + cc11df8 + cd54577 + 298afbb + 24c5cf6 + fa546ac + 5e4d7a6 + cddbfdf + 7e73be1 + ecda841 + dc32703 + 9bb6302 + fee2498 + f827502 + 4b8d9e1 + eff3fbb + 240c93a + 3778e71 + c7f821e + fa5d8fc + b3fb51a + c6bda54 + 6da2074 + fcfa508 + a57a7d5 + 9082749 + a11f648 + 8eb2158 + 4028b25 + e2d582a + 7fed477 + 7f78a52 commit ba1a34e
Show file tree
Hide file tree
Showing 30 changed files with 949 additions and 79 deletions.
6 changes: 3 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
}
},
"require": {
"php": ">=5.3.3",
"php": ">=5.3.23",
"zendframework/zend-stdlib": "self.version"
},
"require-dev": {
Expand All @@ -33,8 +33,8 @@
},
"extra": {
"branch-alias": {
"dev-master": "2.2-dev",
"dev-develop": "2.3-dev"
"dev-master": "2.3-dev",
"dev-develop": "2.4-dev"
}
},
"autoload-dev": {
Expand Down
172 changes: 172 additions & 0 deletions src/AbstractConfigFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\Config;

use Traversable;
use Zend\ServiceManager;

/**
* Class AbstractConfigFactory
*/
class AbstractConfigFactory implements ServiceManager\AbstractFactoryInterface
{
/**
* @var array
*/
protected $configs = array();

/**
* @var string[]
*/
protected $defaultPatterns = array(
'#config[\._-](.*)$#i',
'#^(.*)[\\\\\._-]config$#i'
);

/**
* @var string[]
*/
protected $patterns;

/**
* Determine if we can create a service with name
*
* @param ServiceManager\ServiceLocatorInterface $serviceLocator
* @param string $name
* @param string $requestedName
* @return bool
*/
public function canCreateServiceWithName(ServiceManager\ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
if (isset($this->configs[$requestedName])) {
return true;
}

if (!$serviceLocator->has('Config')) {
return false;
}

$key = $this->match($requestedName);
if (null === $key) {
return false;
}

$config = $serviceLocator->get('Config');
return isset($config[$key]);
}

/**
* Create service with name
*
* @param ServiceManager\ServiceLocatorInterface $serviceLocator
* @param string $name
* @param string $requestedName
* @return string|mixed|array
*/
public function createServiceWithName(ServiceManager\ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
if (isset($this->configs[$requestedName])) {
return $this->configs[$requestedName];
}

$key = $this->match($requestedName);
if (isset($this->configs[$key])) {
$this->configs[$requestedName] = $this->configs[$key];
return $this->configs[$key];
}

$config = $serviceLocator->get('Config');
$this->configs[$requestedName] = $this->configs[$key] = $config[$key];
return $config;
}

/**
* @param string $pattern
* @return self
* @throws Exception\InvalidArgumentException
*/
public function addPattern($pattern)
{
if (!is_string($pattern)) {
throw new Exception\InvalidArgumentException('pattern must be string');
}

$patterns = $this->getPatterns();
array_unshift($patterns, $pattern);
$this->setPatterns($patterns);
return $this;
}

/**
* @param array|Traversable $patterns
* @return self
* @throws Exception\InvalidArgumentException
*/
public function addPatterns($patterns)
{
if ($patterns instanceof Traversable) {
$patterns = iterator_to_array($patterns);
}

if (!is_array($patterns)) {
throw new Exception\InvalidArgumentException("patterns must be array or Traversable");
}

foreach ($patterns as $pattern) {
$this->addPattern($pattern);
}

return $this;
}

/**
* @param array|Traversable $patterns
* @return self
* @throws \InvalidArgumentException
*/
public function setPatterns($patterns)
{
if ($patterns instanceof Traversable) {
$patterns = iterator_to_array($patterns);
}

if (!is_array($patterns)) {
throw new \InvalidArgumentException("patterns must be array or Traversable");
}

$this->patterns = $patterns;
return $this;
}

/**
* @return array
*/
public function getPatterns()
{
if (null === $this->patterns) {
$this->setPatterns($this->defaultPatterns);
}
return $this->patterns;
}

/**
* @param string $requestedName
* @return null|string
*/
protected function match($requestedName)
{
foreach ($this->getPatterns() as $pattern) {
if (preg_match($pattern, $requestedName, $matches)) {
return $matches[1];
}
}
return null;
}
}
36 changes: 29 additions & 7 deletions src/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,34 @@ class Factory
*
* @param string $filename
* @param bool $returnConfigObject
* @param bool $useIncludePath
* @return array|Config
* @throws Exception\InvalidArgumentException
* @throws Exception\RuntimeException
*/
public static function fromFile($filename, $returnConfigObject = false)
public static function fromFile($filename, $returnConfigObject = false, $useIncludePath = false)
{
$pathinfo = pathinfo($filename);
$filepath = $filename;
if (!file_exists($filename)) {
if (!$useIncludePath) {
throw new Exception\RuntimeException(sprintf(
'Filename "%s" cannot be found relative to the working directory',
$filename
));
}

$fromIncludePath = stream_resolve_include_path($filename);
if (!$fromIncludePath) {
throw new Exception\RuntimeException(sprintf(
'Filename "%s" cannot be found relative to the working directory or the include_path ("%s")',
$filename,
get_include_path()
));
}
$filepath = $fromIncludePath;
}

$pathinfo = pathinfo($filepath);

if (!isset($pathinfo['extension'])) {
throw new Exception\RuntimeException(sprintf(
Expand All @@ -77,14 +98,14 @@ public static function fromFile($filename, $returnConfigObject = false)
$extension = strtolower($pathinfo['extension']);

if ($extension === 'php') {
if (!is_file($filename) || !is_readable($filename)) {
if (!is_file($filepath) || !is_readable($filepath)) {
throw new Exception\RuntimeException(sprintf(
"File '%s' doesn't exist or not readable",
$filename
));
}

$config = include $filename;
$config = include $filepath;
} elseif (isset(static::$extensions[$extension])) {
$reader = static::$extensions[$extension];
if (!$reader instanceof Reader\ReaderInterface) {
Expand All @@ -93,7 +114,7 @@ public static function fromFile($filename, $returnConfigObject = false)
}

/** @var Reader\ReaderInterface $reader */
$config = $reader->fromFile($filename);
$config = $reader->fromFile($filepath);
} else {
throw new Exception\RuntimeException(sprintf(
'Unsupported config file extension: .%s',
Expand All @@ -109,14 +130,15 @@ public static function fromFile($filename, $returnConfigObject = false)
*
* @param array $files
* @param bool $returnConfigObject
* @param bool $useIncludePath
* @return array|Config
*/
public static function fromFiles(array $files, $returnConfigObject = false)
public static function fromFiles(array $files, $returnConfigObject = false, $useIncludePath = false)
{
$config = array();

foreach ($files as $file) {
$config = ArrayUtils::merge($config, static::fromFile($file));
$config = ArrayUtils::merge($config, static::fromFile($file, false, $useIncludePath));
}

return ($returnConfigObject) ? new Config($config) : $config;
Expand Down
99 changes: 66 additions & 33 deletions src/Processor/Token.php
Original file line number Diff line number Diff line change
Expand Up @@ -176,17 +176,30 @@ public function setToken($token, $value)

/**
* Build replacement map
*
* @return array
*/
protected function buildMap()
{
if (!$this->suffix && !$this->prefix) {
$this->map = $this->tokens;
} else {
$this->map = array();
foreach ($this->tokens as $token => $value) {
$this->map[$this->prefix . $token . $this->suffix] = $value;
if (null === $this->map) {
if (!$this->suffix && !$this->prefix) {
$this->map = $this->tokens;
} else {
$this->map = array();

foreach ($this->tokens as $token => $value) {
$this->map[$this->prefix . $token . $this->suffix] = $value;
}
}

foreach (array_keys($this->map) as $key) {
if (empty($key)) {
unset($this->map[$key]);
}
}
}

return $this->map;
}

/**
Expand All @@ -198,28 +211,7 @@ protected function buildMap()
*/
public function process(Config $config)
{
if ($config->isReadOnly()) {
throw new Exception\InvalidArgumentException('Cannot process config because it is read-only');
}

if ($this->map === null) {
$this->buildMap();
}

/**
* Walk through config and replace values
*/
$keys = array_keys($this->map);
$values = array_values($this->map);
foreach ($config as $key => $val) {
if ($val instanceof Config) {
$this->process($val);
} else {
$config->$key = str_replace($keys, $values, $val);
}
}

return $config;
return $this->doProcess($config, $this->buildMap());
}

/**
Expand All @@ -230,12 +222,53 @@ public function process(Config $config)
*/
public function processValue($value)
{
if ($this->map === null) {
$this->buildMap();
return $this->doProcess($value, $this->buildMap());
}

/**
* Applies replacement map to the given value by modifying the value itself
*
* @param mixed $value
* @param array $replacements
*
* @return mixed
*
* @throws Exception\InvalidArgumentException if the provided value is a read-only {@see Config}
*/
private function doProcess($value, array $replacements)
{
if ($value instanceof Config) {
if ($value->isReadOnly()) {
throw new Exception\InvalidArgumentException('Cannot process config because it is read-only');
}

foreach ($value as $key => $val) {
$value->$key = $this->doProcess($val, $replacements);
}

return $value;
}

if ($value instanceof Traversable || is_array($value)) {
foreach ($value as & $val) {
$val = $this->doProcess($val, $replacements);
}

return $value;
}

if (!is_string($value) && (is_bool($value) || is_numeric($value))) {
$stringVal = (string) $value;
$changedVal = strtr($value, $this->map);

// replace the value only if a string replacement occurred
if ($changedVal !== $stringVal) {
return $changedVal;
}

return $value;
}
$keys = array_keys($this->map);
$values = array_values($this->map);

return str_replace($keys, $values, $value);
return strtr((string) $value, $this->map);
}
}
Loading

0 comments on commit ba1a34e

Please sign in to comment.