Browse Source

Working getClassMap() changes

Jose Diaz-Gonzalez 11 years ago
parent
commit
dac8362cae

+ 5 - 5
.travis.yml

@@ -6,9 +6,9 @@ php:
   - 5.6
 
 env:
-  - DB=mysql db_dsn='Cake\Database\Driver\Mysql://travis@0.0.0.0/cakephp_test'
-  - DB=pgsql db_dsn='Cake\Database\Driver\Postgres://postgres@127.0.0.1/cakephp_test'
-  - DB=sqlite db_dsn='Cake\Database\Driver\Sqlite:///memory:'
+  - DB=mysql db_dsn='mysql://travis@0.0.0.0/cakephp_test'
+  - DB=pgsql db_dsn='postgres://postgres@127.0.0.1/cakephp_test'
+  - DB=sqlite db_dsn='sqlite:///memory:'
 
 services:
   - memcached
@@ -21,9 +21,9 @@ matrix:
     - php: 5.4
       env: PHPCS=1
     - php: hhvm-nightly
-      env: HHVM=1 DB=sqlite db_dsn='Cake\Database\Driver\Sqlite:///memory:'
+      env: HHVM=1 DB=sqlite db_dsn='sqlite:///memory:'
     - php: hhvm-nightly
-      env: HHVM=1 DB=mysql db_dsn='Cake\Database\Driver\Mysql://travis@0.0.0.0/cakephp_test'
+      env: HHVM=1 DB=mysql db_dsn='mysql://travis@0.0.0.0/cakephp_test'
 
 before_script:
   - composer self-update

+ 1 - 1
appveyor.yml

@@ -10,7 +10,7 @@ environment:
     PHP: "C:/PHP"
   matrix:
       - db: 2012
-        db_dsn: 'Cake\Database\Driver\Sqlserver://sa:Password12!@.\SQL2012SP1/cakephp?MultipleActiveResultSets=false'
+        db_dsn: 'sqlserver://sa:Password12!@.\SQL2012SP1/cakephp?MultipleActiveResultSets=false'
 services:
   - mssql2012sp1
 init:

+ 12 - 0
src/Cache/Cache.php

@@ -478,4 +478,16 @@ class Cache {
 		return $results;
 	}
 
+	public static function getClassMap() {
+		return [
+			'apc' => 'Cake\Cache\Engine\ApcEngine',
+			'file' => 'Cake\Cache\Engine\FileEngine',
+			'memcached' => 'Cake\Cache\Engine\MemcachedEngine',
+			'null' => 'Cake\Cache\Engine\NullEngine',
+			'redis' => 'Cake\Cache\Engine\RedisEngine',
+			'wincache' => 'Cake\Cache\Engine\WincacheEngine',
+			'xcache' => 'Cake\Cache\Engine\XcacheEngine',
+		];
+	}
+
 }

+ 9 - 10
src/Core/StaticConfigTrait.php

@@ -15,6 +15,7 @@
 namespace Cake\Core;
 
 use BadMethodCallException;
+use UnexpectedValueException;
 
 /**
  * A trait that provides a set of static methods to manage configuration
@@ -176,9 +177,7 @@ trait StaticConfigTrait {
 		$dsn = $config['url'];
 
 		if (preg_match("/^([\w\\\]+)/", $dsn, $matches)) {
-			$scheme = explode('\\', $matches[1]);
-			$scheme = array_pop($scheme);
-			$driver = $matches[1];
+			$scheme = $matches[1];
 			$dsn = preg_replace("/^([\w\\\]+)/", 'file', $dsn);
 		}
 
@@ -188,6 +187,7 @@ trait StaticConfigTrait {
 			return $config;
 		}
 
+		$parsed['scheme'] = $scheme;
 		$query = '';
 
 		if (isset($parsed['query'])) {
@@ -216,15 +216,14 @@ trait StaticConfigTrait {
 
 		unset($config['url']);
 		$config = array_merge($config, $parsed, $queryArgs);
-		unset($config['user'], $config['pass'], $config['scheme']);
+		unset($config['user'], $config['pass']);
 
-		if ($driver !== null) {
-			if (empty($config['driver'])) {
-				$config['driver'] = $driver;
-			}
+		if (empty($config['className']) && method_exists(get_called_class(), 'getClassMap')) {
+			$classMap = static::getClassMap();
 
-			if (empty($config['className'])) {
-				$config['className'] = $driver;
+			$config['className'] = $config['scheme'];
+			if (isset($classMap[$config['scheme']])) {
+				$config['className'] = $classMap[$config['scheme']];
 			}
 		}
 

+ 15 - 1
src/Datasource/ConnectionManager.php

@@ -94,14 +94,28 @@ class ConnectionManager {
 	public static function parseDsn($config = null) {
 		$config = static::_parseDsn($config);
 
-		if (isset($config['path'])) {
+		if (isset($config['path']) && empty($config['database'])) {
 			$config['database'] = substr($config['path'], 1);
 		}
 
+		if (empty($config['driver'])) {
+			$config['driver'] = $config['className'];
+			$config['className'] = 'Cake\Database\Connection';
+		}
+
 		unset($config['path']);
 		return $config;
 	}
 
+	public static function getClassMap() {
+		return [
+			'mysql' => 'Cake\Database\Driver\Mysql',
+			'postgres' => 'Cake\Database\Driver\Postgres',
+			'sqlite' => 'Cake\Database\Driver\Sqlite',
+			'sqlserver' => 'Cake\Database\Driver\Sqlserver',
+		];
+	}
+
 /**
  * Set one or more connection aliases.
  *

+ 7 - 0
src/Log/Log.php

@@ -481,4 +481,11 @@ class Log {
 		return static::write(static::$_levelMap['info'], $message, $context);
 	}
 
+	public static function getClassMap() {
+		return [
+			'console' => 'Cake\Log\Engine\ConsoleLog',
+			'file' => 'Cake\Log\Engine\FileLog',
+			'syslog' => 'Cake\Log\Engine\SyslogLog',
+		];
+	}
 }

+ 9 - 0
src/Network/Email/Email.php

@@ -1815,4 +1815,13 @@ class Email {
 		return strtoupper($this->charset);
 	}
 
+
+	public static function getClassMap() {
+		return [
+			'debug' => 'Cake\Network\Email\DebugTransport',
+			'mail' => 'Cake\Network\Email\MailTransport',
+			'smtp' => 'Cake\Network\Email\SmtpTransport',
+		];
+	}
+
 }

+ 171 - 79
tests/TestCase/Core/StaticConfigTraitTest.php

@@ -18,6 +18,93 @@ use Cake\TestSuite\TestCase;
 use PHPUnit_Framework_Test;
 
 /**
+ * TestConnectionManagerStaticConfig
+ */
+class TestConnectionManagerStaticConfig {
+
+	use StaticConfigTrait {
+		parseDsn as protected _parseDsn;
+	}
+
+	public static function parseDsn($config = null) {
+		$config = static::_parseDsn($config);
+
+		if (isset($config['path']) && empty($config['database'])) {
+			$config['database'] = substr($config['path'], 1);
+		}
+
+		if (empty($config['driver'])) {
+			$config['driver'] = $config['className'];
+			$config['className'] = 'Cake\Database\Connection';
+		}
+
+		unset($config['path']);
+		return $config;
+	}
+
+	public static function getClassMap() {
+		return [
+			'mysql' => 'Cake\Database\Driver\Mysql',
+			'postgres' => 'Cake\Database\Driver\Postgres',
+			'sqlite' => 'Cake\Database\Driver\Sqlite',
+			'sqlserver' => 'Cake\Database\Driver\Sqlserver',
+		];
+	}
+}
+
+/**
+ * TestCacheStaticConfig
+ */
+class TestCacheStaticConfig {
+
+	use StaticConfigTrait;
+
+	public static function getClassMap() {
+		return [
+			'apc' => 'Cake\Cache\Engine\ApcEngine',
+			'file' => 'Cake\Cache\Engine\FileEngine',
+			'memcached' => 'Cake\Cache\Engine\MemcachedEngine',
+			'null' => 'Cake\Cache\Engine\NullEngine',
+			'redis' => 'Cake\Cache\Engine\RedisEngine',
+			'wincache' => 'Cake\Cache\Engine\WincacheEngine',
+			'xcache' => 'Cake\Cache\Engine\XcacheEngine',
+		];
+	}
+}
+
+/**
+ * TestEmailStaticConfig
+ */
+class TestEmailStaticConfig {
+
+	use StaticConfigTrait;
+
+	public static function getClassMap() {
+		return [
+			'debug' => 'Cake\Network\Email\DebugTransport',
+			'mail' => 'Cake\Network\Email\MailTransport',
+			'smtp' => 'Cake\Network\Email\SmtpTransport',
+		];
+	}
+}
+
+/**
+ * TestLogStaticConfig
+ */
+class TestLogStaticConfig {
+
+	use StaticConfigTrait;
+
+	public static function getClassMap() {
+		return [
+			'console' => 'Cake\Log\Engine\ConsoleLog',
+			'file' => 'Cake\Log\Engine\FileLog',
+			'syslog' => 'Cake\Log\Engine\SyslogLog',
+		];
+	}
+}
+
+/**
  * StaticConfigTraitTest class
  *
  */
@@ -52,57 +139,63 @@ class StaticConfigTraitTest extends TestCase {
 
 		$this->assertInternalType('array', $klassName::parseDsn(['url' => 'http://user@:80']));
 		$this->assertEquals(['url' => 'http://user@:80'], $klassName::parseDsn(['url' => 'http://user@:80']));
+	}
 
+	public function testCustomParseDsn() {
 		$dsn = 'mysql://localhost:3306/database';
 		$expected = [
-			'className' => 'mysql',
-			'driver' => 'mysql',
+			'className' => 'Cake\Database\Connection',
+			'driver' => 'Cake\Database\Driver\Mysql',
 			'host' => 'localhost',
-			'path' => '/database',
+			'database' => 'database',
 			'port' => 3306,
+			'scheme' => 'mysql',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
 		$dsn = 'mysql://user:password@localhost:3306/database';
 		$expected = [
-			'className' => 'mysql',
-			'driver' => 'mysql',
+			'className' => 'Cake\Database\Connection',
+			'driver' => 'Cake\Database\Driver\Mysql',
 			'host' => 'localhost',
 			'password' => 'password',
-			'path' => '/database',
+			'database' => 'database',
 			'port' => 3306,
+			'scheme' => 'mysql',
 			'username' => 'user',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'Cake\Database\Driver\Sqlite:///memory:';
+		$dsn = 'sqlite:///memory:';
 		$expected = [
-			'className' => 'Cake\Database\Driver\Sqlite',
+			'className' => 'Cake\Database\Connection',
 			'driver' => 'Cake\Database\Driver\Sqlite',
-			'path' => '/memory:',
+			'database' => 'memory:',
+			'scheme' => 'sqlite',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'Cake\Database\Driver\Sqlite:///?database=memory:';
+		$dsn = 'sqlite:///?database=memory:';
 		$expected = [
-			'className' => 'Cake\Database\Driver\Sqlite',
+			'className' => 'Cake\Database\Connection',
 			'driver' => 'Cake\Database\Driver\Sqlite',
 			'database' => 'memory:',
-			'path' => '/',
+			'scheme' => 'sqlite',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'Cake\Database\Driver\Sqlserver://sa:Password12!@.\SQL2012SP1/cakephp?MultipleActiveResultSets=false';
+		$dsn = 'sqlserver://sa:Password12!@.\SQL2012SP1/cakephp?MultipleActiveResultSets=false';
 		$expected = [
-			'className' => 'Cake\Database\Driver\Sqlserver',
+			'className' => 'Cake\Database\Connection',
 			'driver' => 'Cake\Database\Driver\Sqlserver',
 			'host' => '.\SQL2012SP1',
 			'MultipleActiveResultSets' => false,
 			'password' => 'Password12!',
-			'path' => '/cakephp',
+			'database' => 'cakephp',
+			'scheme' => 'sqlserver',
 			'username' => 'sa',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 	}
 
 /**
@@ -111,58 +204,61 @@ class StaticConfigTraitTest extends TestCase {
  * @return void
  */
 	public function testParseDsnClassnameDriver() {
-		$klassName = get_class($this->subject);
-
-		$dsn = 'Cake\Database\Driver\Mysql://localhost:3306/database';
+		$dsn = 'mysql://localhost:3306/database';
 		$expected = [
-			'className' => 'Cake\Database\Driver\Mysql',
+			'className' => 'Cake\Database\Connection',
+			'database' => 'database',
 			'driver' => 'Cake\Database\Driver\Mysql',
 			'host' => 'localhost',
-			'path' => '/database',
 			'port' => 3306,
+			'scheme' => 'mysql',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'Cake\Database\Driver\Mysql://user:password@localhost:3306/database';
+		$dsn = 'mysql://user:password@localhost:3306/database';
 		$expected = [
-			'className' => 'Cake\Database\Driver\Mysql',
+			'className' => 'Cake\Database\Connection',
+			'database' => 'database',
 			'driver' => 'Cake\Database\Driver\Mysql',
 			'host' => 'localhost',
 			'password' => 'password',
-			'path' => '/database',
 			'port' => 3306,
+			'scheme' => 'mysql',
 			'username' => 'user',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'Cake\Database\Driver\Mysql://localhost/database?className=Cake\Database\Connection';
+		$dsn = 'mysql://localhost/database?className=Custom\Driver';
 		$expected = [
 			'className' => 'Cake\Database\Connection',
-			'driver' => 'Cake\Database\Driver\Mysql',
+			'database' => 'database',
+			'driver' => 'Custom\Driver',
 			'host' => 'localhost',
-			'path' => '/database',
+			'scheme' => 'mysql',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'Cake\Database\Driver\Mysql://localhost:3306/database?className=Cake\Database\Connection';
+		$dsn = 'mysql://localhost:3306/database?className=Custom\Driver';
 		$expected = [
 			'className' => 'Cake\Database\Connection',
-			'driver' => 'Cake\Database\Driver\Mysql',
+			'database' => 'database',
+			'driver' => 'Custom\Driver',
 			'host' => 'localhost',
-			'path' => '/database',
+			'scheme' => 'mysql',
 			'port' => 3306,
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 
 		$dsn = 'Cake\Database\Connection://localhost:3306/database?driver=Cake\Database\Driver\Mysql';
 		$expected = [
 			'className' => 'Cake\Database\Connection',
+			'database' => 'database',
 			'driver' => 'Cake\Database\Driver\Mysql',
 			'host' => 'localhost',
-			'path' => '/database',
+			'scheme' => 'Cake\Database\Connection',
 			'port' => 3306,
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestConnectionManagerStaticConfig::parseDsn(['url' => $dsn]));
 	}
 
 /**
@@ -171,90 +267,88 @@ class StaticConfigTraitTest extends TestCase {
  * @return void
  */
 	public function testParseDsnQuerystring() {
-		$klassName = get_class($this->subject);
-
+		$dsn = 'file:///?url=test';
 		$expected = [
 			'className' => 'Cake\Log\Engine\FileLog',
-			'driver' => 'Cake\Log\Engine\FileLog',
-			'url' => 'test',
 			'path' => '/',
+			'scheme' => 'file',
+			'url' => 'test',
 		];
-		$dsn = 'Cake\Log\Engine\FileLog:///?url=test';
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestLogStaticConfig::parseDsn(['url' => $dsn]));
 
+		$dsn = 'file:///?file=debug&key=value';
 		$expected = [
 			'className' => 'Cake\Log\Engine\FileLog',
-			'driver' => 'Cake\Log\Engine\FileLog',
 			'file' => 'debug',
-			'path' => '/',
 			'key' => 'value',
+			'path' => '/',
+			'scheme' => 'file',
 		];
-		$dsn = 'Cake\Log\Engine\FileLog:///?file=debug&key=value';
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestLogStaticConfig::parseDsn(['url' => $dsn]));
 
+		$dsn = 'file:///tmp?file=debug&types[]=notice&types[]=info&types[]=debug';
 		$expected = [
 			'className' => 'Cake\Log\Engine\FileLog',
-			'driver' => 'Cake\Log\Engine\FileLog',
 			'file' => 'debug',
 			'path' => '/tmp',
+			'scheme' => 'file',
 			'types' => ['notice', 'info', 'debug'],
 		];
-		$dsn = 'Cake\Log\Engine\FileLog:///tmp?file=debug&types[]=notice&types[]=info&types[]=debug';
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestLogStaticConfig::parseDsn(['url' => $dsn]));
 
+		$dsn = 'mail:///?timeout=30&key=true&key2=false&client=null&tls=null';
 		$expected = [
-			'className' => 'Mail',
+			'className' => 'Cake\Network\Email\MailTransport',
 			'client' => null,
-			'driver' => 'Mail',
 			'key' => true,
 			'key2' => false,
 			'path' => '/',
+			'scheme' => 'mail',
 			'timeout' => '30',
 			'tls' => null,
 		];
-		$dsn = 'Mail:///?timeout=30&key=true&key2=false&client=null&tls=null';
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestEmailStaticConfig::parseDsn(['url' => $dsn]));
 
+		$dsn = 'mail://true:false@null/1?timeout=30&key=true&key2=false&client=null&tls=null';
 		$expected = [
-			'className' => 'Mail',
+			'className' => 'Cake\Network\Email\MailTransport',
 			'client' => null,
-			'driver' => 'Mail',
 			'host' => 'null',
 			'key' => true,
 			'key2' => false,
 			'password' => 'false',
 			'path' => '/1',
+			'scheme' => 'mail',
 			'timeout' => '30',
 			'tls' => null,
 			'username' => 'true',
 		];
-		$dsn = 'Mail://true:false@null/1?timeout=30&key=true&key2=false&client=null&tls=null';
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestEmailStaticConfig::parseDsn(['url' => $dsn]));
 
+		$dsn = 'mail://user:secret@localhost:25?timeout=30&client=null&tls=null';
 		$expected = [
-			'className' => 'Mail',
+			'className' => 'Cake\Network\Email\MailTransport',
 			'client' => null,
-			'driver' => 'Mail',
 			'host' => 'localhost',
 			'password' => 'secret',
 			'port' => 25,
+			'scheme' => 'mail',
 			'timeout' => '30',
 			'tls' => null,
 			'username' => 'user',
 		];
-		$dsn = 'Mail://user:secret@localhost:25?timeout=30&client=null&tls=null';
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestEmailStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'File:///?prefix=myapp_cake_core_&serialize=true&duration=%2B2 minutes';
+		$dsn = 'file:///?prefix=myapp_cake_core_&serialize=true&duration=%2B2 minutes';
 		$expected = [
-			'className' => 'File',
-			'driver' => 'File',
+			'className' => 'Cake\Log\Engine\FileLog',
 			'duration' => '+2 minutes',
 			'path' => '/',
 			'prefix' => 'myapp_cake_core_',
+			'scheme' => 'file',
 			'serialize' => true,
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestLogStaticConfig::parseDsn(['url' => $dsn]));
 	}
 
 /**
@@ -263,23 +357,21 @@ class StaticConfigTraitTest extends TestCase {
  * @return void
  */
 	public function testParseDsnPathSetting() {
-		$klassName = get_class($this->subject);
-
-		$dsn = 'File:///';
+		$dsn = 'file:///';
 		$expected = [
-			'className' => 'File',
-			'driver' => 'File',
+			'className' => 'Cake\Log\Engine\FileLog',
 			'path' => '/',
+			'scheme' => 'file',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestLogStaticConfig::parseDsn(['url' => $dsn]));
 
-		$dsn = 'File:///?path=/tmp/persistent/';
+		$dsn = 'file:///?path=/tmp/persistent/';
 		$expected = [
-			'className' => 'File',
-			'driver' => 'File',
+			'className' => 'Cake\Log\Engine\FileLog',
 			'path' => '/tmp/persistent/',
+			'scheme' => 'file',
 		];
-		$this->assertEquals($expected, $klassName::parseDsn(['url' => $dsn]));
+		$this->assertEquals($expected, TestLogStaticConfig::parseDsn(['url' => $dsn]));
 	}
 
 }

+ 1 - 2
tests/bootstrap.php

@@ -98,11 +98,10 @@ Cache::config([
 
 // Ensure default test connection is defined
 if (!getenv('db_dsn')) {
-	putenv('db_dsn=Cake\Database\Driver\Sqlite:///memory:');
+	putenv('db_dsn=sqlite:///memory:');
 }
 
 ConnectionManager::config('test', [
-	'className' => 'Cake\Database\Connection',
 	'driver' => getenv('db_class'),
 	'url' => getenv('db_dsn'),
 	'database' => getenv('db_database'),