Skip to content

Commit

Permalink
Add ConfigSourceInterface and matching class
Browse files Browse the repository at this point in the history
  • Loading branch information
Seldaek committed Oct 18, 2012
1 parent 3b01d26 commit e410da7
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/Composer/Config.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

namespace Composer;

use Composer\Config\ConfigSourceInterface;

/**
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
Expand All @@ -34,6 +36,7 @@ class Config

private $config;
private $repositories;
private $configSource;

public function __construct()
{
Expand All @@ -42,6 +45,16 @@ public function __construct()
$this->repositories = static::$defaultRepositories;
}

public function setConfigSource(ConfigSourceInterface $source)
{
$this->configSource = $source;
}

public function getConfigSource()
{
return $this->configSource;
}

/**
* Merges new config values with the existing ones (overriding)
*
Expand Down Expand Up @@ -110,6 +123,10 @@ public function get($key)
return rtrim($this->process($this->config[$key]), '/\\');

default:
if (!isset($this->config[$key])) {
return null;
}

return $this->process($this->config[$key]);
}
}
Expand All @@ -135,6 +152,10 @@ private function process($value)
{
$config = $this;

if (!is_string($value)) {
return $value;
}

return preg_replace_callback('#\{\$(.+)\}#', function ($match) use ($config) {
return $config->get($match[1]);
}, $value);
Expand Down
29 changes: 29 additions & 0 deletions src/Composer/Config/ConfigSourceInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Composer\Config;

use Composer\Json\JsonManipulator;

/**
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
interface ConfigSourceInterface
{
public function addRepository($name, $config);

public function removeRepository($name);

public function addConfigSetting($name, $value);

public function removeConfigSetting($name);
}
80 changes: 80 additions & 0 deletions src/Composer/Config/JsonConfigSource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php

/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Composer\Config;

use Composer\Json\JsonManipulator;
use Composer\Json\JsonFile;

/**
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
class JsonConfigSource implements ConfigSourceInterface
{
private $file;
private $manipulator;

public function __construct(JsonFile $file)
{
$this->file = $file;
}

public function addRepository($name, $config)
{
return $this->manipulateJson('addRepository', $name, $config, function (&$config, $repo, $repoConfig) {
$config['repositories'][$repo] = $repoConfig;
});
}

public function removeRepository($name)
{
return $this->manipulateJson('removeRepository', $name, function (&$config, $repo) {
unset($config['repositories'][$repo]);
});
}

public function addConfigSetting($name, $value)
{
$this->manipulateJson('addConfigSetting', $name, $value, function (&$config, $key, $val) {
$config['config'][$key] = $val;
});
}

public function removeConfigSetting($name)
{
return $this->manipulateJson('removeConfigSetting', $name, function (&$config, $key) {
unset($config['config'][$key]);
});
}

protected function manipulateJson($method, $args, $fallback)
{
$args = func_get_args();
// remove method & fallback
array_shift($args);
$fallback = array_pop($args);

$contents = file_get_contents($this->file->getPath());
$manipulator = new JsonManipulator($contents);

// try to update cleanly
if (call_user_func_array(array($manipulator, $method), $args)) {
file_put_contents($this->file->getPath(), $manipulator->getContents());
} else {
// on failed clean update, call the fallback and rewrite the whole file
$config = $this->file->read();
array_unshift($args, $config);
call_user_func_array($fallback, $args);
$this->file->write($config);
}
}
}
2 changes: 2 additions & 0 deletions src/Composer/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

namespace Composer;

use Composer\Config\JsonConfigSource;
use Composer\Json\JsonFile;
use Composer\IO\IOInterface;
use Composer\Repository\ComposerRepository;
Expand Down Expand Up @@ -59,6 +60,7 @@ public static function createConfig()
if ($file->exists()) {
$config->merge($file->read());
}
$config->setConfigSource(new JsonConfigSource($file));

return $config;
}
Expand Down

0 comments on commit e410da7

Please sign in to comment.