diff --git a/composer.json b/composer.json index ea532ed47..83bc0818c 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,10 @@ "license": "MIT", "description": "Send your app metrics to InfluxDB", "require": { - "guzzlehttp/guzzle": "~4" + "guzzlehttp/guzzle": "~4", + "zendframework/zend-stdlib": "~2", + "zendframework/zend-filter": "~2", + "zendframework/zend-servicemanager": "~2" }, "require-dev": { "phpspec/phpspec": "2.*", diff --git a/composer.lock b/composer.lock index 18269867e..6fda5d2a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "17fa2295e2cd007935278098484ab7cc", + "hash": "5647460e792745752274202f2289a0cc", "packages": [ { "name": "guzzlehttp/guzzle", @@ -123,6 +123,155 @@ "stream" ], "time": "2014-08-17 21:15:53" + }, + { + "name": "zendframework/zend-filter", + "version": "2.3.1", + "target-dir": "Zend/Filter", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendFilter.git", + "reference": "1889b7aa499beccadac770780a73e1a40e0f8a53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendFilter/zipball/1889b7aa499beccadac770780a73e1a40e0f8a53", + "reference": "1889b7aa499beccadac770780a73e1a40e0f8a53", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-crypt": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-crypt": "Zend\\Crypt component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component for UriNormalize filter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Zend\\Filter\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed data filters", + "keywords": [ + "filter", + "zf2" + ], + "time": "2014-04-15 15:28:47" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.3.1", + "target-dir": "Zend/ServiceManager", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendServiceManager.git", + "reference": "652ab6e142b7afd1eede8f0f33b47d2599786c84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendServiceManager/zipball/652ab6e142b7afd1eede8f0f33b47d2599786c84", + "reference": "652ab6e142b7afd1eede8f0f33b47d2599786c84", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "zendframework/zend-di": "self.version" + }, + "suggest": { + "zendframework/zend-di": "Zend\\Di component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Zend\\ServiceManager\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "keywords": [ + "servicemanager", + "zf2" + ], + "time": "2014-04-15 15:28:43" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.3.1", + "target-dir": "Zend/Stdlib", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendStdlib.git", + "reference": "c1f4830018b5d4f034d32fa01a9e17ea176f56f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendStdlib/zipball/c1f4830018b5d4f034d32fa01a9e17ea176f56f6", + "reference": "c1f4830018b5d4f034d32fa01a9e17ea176f56f6", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "zendframework/zend-eventmanager": "self.version", + "zendframework/zend-serializer": "self.version", + "zendframework/zend-servicemanager": "self.version" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Zend\\Stdlib\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "keywords": [ + "stdlib", + "zf2" + ], + "time": "2014-04-15 15:28:48" } ], "packages-dev": [ diff --git a/src/InfluxDB/Adapter/GuzzleAdapter.php b/src/InfluxDB/Adapter/GuzzleAdapter.php index 96a109a4a..1fa1d35ea 100644 --- a/src/InfluxDB/Adapter/GuzzleAdapter.php +++ b/src/InfluxDB/Adapter/GuzzleAdapter.php @@ -17,6 +17,11 @@ class GuzzleAdapter implements AdapterInterface, QueryableInterface $this->options = $options; } + public function getOptions() + { + return $this->options; + } + public function send($message, $timePrecision = false) { $httpMessage = [ diff --git a/src/InfluxDB/Adapter/UdpAdapter.php b/src/InfluxDB/Adapter/UdpAdapter.php index 4cc08c775..ea831745c 100644 --- a/src/InfluxDB/Adapter/UdpAdapter.php +++ b/src/InfluxDB/Adapter/UdpAdapter.php @@ -12,6 +12,11 @@ class UdpAdapter implements AdapterInterface $this->options = $options; } + public function getOptions() + { + return $this->options; + } + /** * @todo Handle timePrecision parameter */ diff --git a/src/InfluxDB/ClientFactory.php b/src/InfluxDB/ClientFactory.php new file mode 100644 index 000000000..1fe7846d1 --- /dev/null +++ b/src/InfluxDB/ClientFactory.php @@ -0,0 +1,47 @@ + [ + "name" => false, + "options" => [], + ], + "options" => [], + ]; + + public static function create(array $options) + { + $options = array_replace_recursive(self::$options, $options); + + $adapterName = $options["adapter"]["name"]; + if (!class_exists($adapterName)) { + throw new \InvalidArgumentException("Missing class: {$adapterName}"); + } + $adapterOptions = new Options(); + + $hydrator = new ClassMethods(); + $hydrator->hydrate($options["options"], $adapterOptions); + + $adapter = null; + switch ($adapterName) { + case 'InfluxDB\\Adapter\\UdpAdapter': + $adapter = new $adapterName($adapterOptions); + break; + case 'InfluxDB\\Adapter\\GuzzleAdapter': + $adapter = new $adapterName(new GuzzleClient($options["adapter"]["options"]), $adapterOptions); + break; + default: + throw new \InvalidArgumentException("Missing adapter {$adapter}"); + } + + $client = new Client(); + $client->setAdapter($adapter); + + return $client; + } +} diff --git a/tests/InfluxDB/ClientFactoryTest.php b/tests/InfluxDB/ClientFactoryTest.php new file mode 100644 index 000000000..febd80294 --- /dev/null +++ b/tests/InfluxDB/ClientFactoryTest.php @@ -0,0 +1,57 @@ + [ + "name" => "InfluxDB\\Adapter\\UdpAdapter", + ], + "options" => [ + "host" => "127.0.0.1", + "username" => "user", + "password" => "pass", + ], + ]; + + $client = ClientFactory::create($options); + $this->assertInstanceOf("InfluxDB\\Client", $client); + + $this->assertInstanceOf("InfluxDB\\Adapter\\UdpAdapter", $client->getAdapter()); + $this->assertEquals("127.0.0.1", $client->getAdapter()->getOptions()->getHost()); + $this->assertEquals("user", $client->getAdapter()->getOptions()->getUsername()); + $this->assertEquals("pass", $client->getAdapter()->getOptions()->getPassword()); + } + + /** + * @group factory + * @group tcp + */ + public function testCreateTcpClient() + { + $options = [ + "adapter" => [ + "name" => "InfluxDB\\Adapter\\GuzzleAdapter", + ], + "options" => [ + "host" => "127.0.0.1", + "username" => "user", + "password" => "pass", + ], + ]; + + $client = ClientFactory::create($options); + $this->assertInstanceOf("InfluxDB\\Client", $client); + + $this->assertInstanceOf("InfluxDB\\Adapter\\GuzzleAdapter", $client->getAdapter()); + $this->assertEquals("127.0.0.1", $client->getAdapter()->getOptions()->getHost()); + $this->assertEquals("user", $client->getAdapter()->getOptions()->getUsername()); + $this->assertEquals("pass", $client->getAdapter()->getOptions()->getPassword()); + } +}