Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added ConfigReaderInterface::dump() and made all readers' dump() method ... #992

Merged
merged 1 commit into from
Nov 30, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lib/Cake/Configure/ConfigReaderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,13 @@ interface ConfigReaderInterface {
*/
public function read($key);

/**
* Dumps the configure data into source.
*
* @param string $key The identifier to write to.
* @param array $data The data to dump.
* @return boolean True on success or false on failure.
*/
public function dump($key, $data);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be added? It will make config adapters that used to work in 2.2 no longer work in 2.3.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since both our core readers have dump() and Configure::dump() does no checks before trying to call a reader's dump() method whether the method actually exists, I thought it would be best to add this method to the interface. We can document this in the migration guide. People using custom readers would be a very small minority anyway.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess there are probably not many custom readers out there, as long as we document it well I'm ok with the interface change.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will ensure the docs are properly updated :)


}
70 changes: 41 additions & 29 deletions lib/Cake/Configure/IniReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,23 +100,8 @@ public function read($key) {
if (strpos($key, '..') !== false) {
throw new ConfigureException(__d('cake_dev', 'Cannot load configuration files with ../ in them.'));
}
if (substr($key, -8) === '.ini.php') {
$key = substr($key, 0, -8);
list($plugin, $key) = pluginSplit($key);
$key .= '.ini.php';
} else {
if (substr($key, -4) === '.ini') {
$key = substr($key, 0, -4);
}
list($plugin, $key) = pluginSplit($key);
$key .= '.ini';
}

if ($plugin) {
$file = App::pluginPath($plugin) . 'Config' . DS . $key;
} else {
$file = $this->_path . $key;
}
$file = $this->_getFilePath($key);
if (!is_file($file)) {
throw new ConfigureException(__d('cake_dev', 'Could not load configuration file: %s', $file));
}
Expand Down Expand Up @@ -165,23 +150,23 @@ protected function _parseNestedValues($values) {
/**
* Dumps the state of Configure data into an ini formatted string.
*
* @param string $filename The filename on $this->_path to save into.
* Extension ".ini" will be automatically appended if not included in filename.
* @param string $key The identifier to write to. If the key has a . it will be treated
* as a plugin prefix.
* @param array $data The data to convert to ini file.
* @return int Bytes saved.
*/
public function dump($filename, $data) {
public function dump($key, $data) {
$result = array();
foreach ($data as $key => $value) {
foreach ($data as $k => $value) {
$isSection = false;
if ($key[0] != '[') {
$result[] = "[$key]";
if ($k[0] != '[') {
$result[] = "[$k]";
$isSection = true;
}
if (is_array($value)) {
$keyValues = Hash::flatten($value, '.');
foreach ($keyValues as $k => $v) {
$result[] = "$k = " . $this->_value($v);
$kValues = Hash::flatten($value, '.');
foreach ($kValues as $k2 => $v) {
$result[] = "$k2 = " . $this->_value($v);
}
}
if ($isSection) {
Expand All @@ -190,10 +175,8 @@ public function dump($filename, $data) {
}
$contents = trim(implode("\n", $result));

if (substr($filename, -4) !== '.ini') {
$filename .= '.ini';
}
return file_put_contents($this->_path . $filename, $contents);
$filename = $this->_getFilePath($key);
return file_put_contents($filename, $contents);
}

/**
Expand All @@ -215,4 +198,33 @@ protected function _value($val) {
return (string)$val;
}

/**
* Get file path
*
* @param string $key The identifier to write to. If the key has a . it will be treated
* as a plugin prefix.
* @return string Full file path
*/
protected function _getFilePath($key) {
if (substr($key, -8) === '.ini.php') {
$key = substr($key, 0, -8);
list($plugin, $key) = pluginSplit($key);
$key .= '.ini.php';
} else {
if (substr($key, -4) === '.ini') {
$key = substr($key, 0, -4);
}
list($plugin, $key) = pluginSplit($key);
$key .= '.ini';
}

if ($plugin) {
$file = App::pluginPath($plugin) . 'Config' . DS . $key;
} else {
$file = $this->_path . $key;
}

return $file;
}

}
46 changes: 29 additions & 17 deletions lib/Cake/Configure/PhpReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function __construct($path = null) {
* Files with `.` in the name will be treated as values in plugins. Instead of reading from
* the initialized path, plugin keys will be located using App::pluginPath().
*
* @param string $key The identifier to read from. If the key has a . it will be treated
* @param string $key The identifier to read from. If the key has a . it will be treated
* as a plugin prefix.
* @return array Parsed configuration values.
* @throws ConfigureException when files don't exist or they don't contain `$config`.
Expand All @@ -62,17 +62,8 @@ public function read($key) {
if (strpos($key, '..') !== false) {
throw new ConfigureException(__d('cake_dev', 'Cannot load configuration files with ../ in them.'));
}
if (substr($key, -4) === '.php') {
$key = substr($key, 0, -4);
}
list($plugin, $key) = pluginSplit($key);
$key .= '.php';

if ($plugin) {
$file = App::pluginPath($plugin) . 'Config' . DS . $key;
} else {
$file = $this->_path . $key;
}
$file = $this->_getFilePath($key);
if (!is_file($file)) {
throw new ConfigureException(__d('cake_dev', 'Could not load configuration file: %s', $file));
}
Expand All @@ -90,18 +81,39 @@ public function read($key) {
* Converts the provided $data into a string of PHP code that can
* be used saved into a file and loaded later.
*
* @param string $filename The filename to create on $this->_path.
* Extension ".php" will be automatically appended if not included in filename.
* @param string $key The identifier to write to. If the key has a . it will be treated
* as a plugin prefix.
* @param array $data Data to dump.
* @return int Bytes saved.
*/
public function dump($filename, $data) {
public function dump($key, $data) {
$contents = '<?php' . "\n" . '$config = ' . var_export($data, true) . ';';

if (substr($filename, -4) !== '.php') {
$filename .= '.php';
$filename = $this->_getFilePath($key);
return file_put_contents($filename, $contents);
}

/**
* Get file path
*
* @param string $key The identifier to write to. If the key has a . it will be treated
* as a plugin prefix.
* @return string Full file path
*/
protected function _getFilePath($key) {
if (substr($key, -4) === '.php') {
$key = substr($key, 0, -4);
}
list($plugin, $key) = pluginSplit($key);
$key .= '.php';

if ($plugin) {
$file = App::pluginPath($plugin) . 'Config' . DS . $key;
} else {
$file = $this->_path . $key;
}
return file_put_contents($this->_path . $filename, $contents);

return $file;
}

}
2 changes: 1 addition & 1 deletion lib/Cake/Core/Configure.php
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ public static function load($key, $config = 'default', $merge = true) {
}

/**
* Dump data currently in Configure into $filename. The serialization format
* Dump data currently in Configure into $key. The serialization format
* is decided by the config reader attached as $config. For example, if the
* 'default' adapter is a PhpReader, the generated file will be a PHP
* configuration file loadable by the PhpReader.
Expand Down