diff --git a/Model/Datasource/CouchDBSource.php b/Model/Datasource/CouchDBSource.php old mode 100644 new mode 100755 index 6e2a994..b05dc5e --- a/Model/Datasource/CouchDBSource.php +++ b/Model/Datasource/CouchDBSource.php @@ -1,47 +1,30 @@ <?php /** - * CouchDB Datasource - * - * PHP version 5 + * CouchDB layer for DBO. * * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) - * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) * * Licensed under The MIT License + * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) * @link http://cakephp.org CakePHP(tm) Project - * @package datasources - * @subpackage datasources.models.datasources - * @since CakePHP Datasources v 0.3 - * @license MIT License (http://www.opensource.org/licenses/mit-license.php) + * @package CouchDB.Model.Datasource + * @since CakePHP(tm) v 0.9 + * @license http://www.opensource.org/licenses/mit-license.php MIT License */ + App::uses('HttpSocket', 'Network/Http'); -App::uses('DataSource', 'Model/Datasource'); /** - * CouchDB Datasource + * CouchDB Datasource. * - * @package datasources - * @subpackage datasources.models.datasources + * @package CouchDB.Model.Datasource */ class CouchDBSource extends DataSource { -/** - * Start quote - * - * @var string - */ - public $startQuote = null; - -/** - * End quote - * - * @var string - */ - public $endQuote = null; - /** * Constructor. * @@ -75,6 +58,7 @@ public function reconnect($config = null) { $this->disconnect(); $this->setConfig($config); $this->_sources = null; + return $this->connect(); } @@ -82,14 +66,17 @@ public function reconnect($config = null) { * Connects to the database. Options are specified in the $config instance variable. * * @return boolean Connected. + * @throws MissingConnectionException */ public function connect() { if ($this->connected !== true) { - if (Set::check($this->config, 'login')) + if (Set::check($this->config, 'login')) { $this->config = Set::insert($this->config, 'request.uri.user', Set::get($this->config, 'login')); + } - if (Set::check($this->config, 'password')) + if (Set::check($this->config, 'password')) { $this->config = Set::insert($this->config, 'request.uri.pass', Set::get($this->config, 'password')); + } try { $this->Socket = new HttpSocket($this->config); @@ -98,6 +85,7 @@ public function connect() { throw new MissingConnectionException(array('class' => $e->getMessage())); } } + return $this->connected; } @@ -112,6 +100,7 @@ public function close() { if (Configure::read('debug') > 1) { //$this->showLog(); } + $this->disconnect(); } @@ -124,31 +113,20 @@ public function disconnect() { if (isset($this->results) && is_resource($this->results)) { $this->results = null; } + $this->connected = false; + return !$this->connected; } /** * List of databases. * + * @param mixed $data * @return array Databases. */ - public function listSources() { - $databases = $this->__decode($this->Socket->get($this->__uri('_all_dbs')), true); - return $databases; - } - -/** - * Convenience method for DboSource::listSources(). - * Returns the names of databases in lowercase. - * - * @return array Lowercase databases. - */ - public function sources($reset = false) { - if ($reset === true) { - $this->_sources = null; - } - return array_map('strtolower', $this->listSources()); + public function listSources($data = null) { + return $this->__decode($this->Socket->get($this->__uri('_all_dbs')), true); } /** @@ -171,14 +149,16 @@ public function describe($model) { * @param array $values An array with key values of the fields. If null, $model->data will be used to generate the field names. * @return boolean Success. */ - public function create($model, $fields = null, $values = null) { + public function create(Model $model, $fields = null, $values = null) { $data = $model->data; + if ($fields !== null && $values !== null) { $data = array_combine($fields, $values); } if (isset($data[$model->primaryKey]) && !empty($data[$model->primaryKey])) { $params = $data[$model->primaryKey]; + unset($data[$model->primaryKey]); } else { $uuids = $this->__decode($this->Socket->get('/_uuids')); $params = $uuids->uuids[0]; @@ -189,8 +169,10 @@ public function create($model, $fields = null, $values = null) { if ($this->__checkOk($result)) { $model->id = $result->id; $model->rev = $result->rev; + return true; } + return false; } @@ -202,7 +184,7 @@ public function create($model, $fields = null, $values = null) { * @param integer $recursive Level number of associations. * @return mixed False if an error occurred, otherwise an array of results. */ - public function read($model, $queryData = array(), $recursive = null) { + public function read(Model $model, $queryData = array(), $recursive = null) { if ($recursive === null && isset($queryData['recursive'])) { $recursive = $queryData['recursive']; } @@ -215,9 +197,22 @@ public function read($model, $queryData = array(), $recursive = null) { if (empty($queryData['conditions'])) { $params = $params . '_all_docs?include_docs=true'; + if (!empty($queryData['limit'])) { $params = $params . '&limit=' . $queryData['limit']; } + + if (!empty($queryData['offset'])) { + $params .= '&skip=' . $queryData['offset']; + } + + if (!empty($queryData['startkey_docid'])) { + $params .= '&startkey_docid=' . $queryData['startkey_docid']; + } + + if (!empty($queryData['descending'])) { + $params .= '&descending=' . $queryData['descending']; + } } else { if (isset($queryData['conditions'][$model->alias . '.' . $model->primaryKey])) { $params = $queryData['conditions'][$model->alias . '.' . $model->primaryKey]; @@ -228,10 +223,17 @@ public function read($model, $queryData = array(), $recursive = null) { if ($model->recursive > -1) { $params = $params . '?revs_info=true'; } + + if (isset($queryData['conditions'][$model->alias . '.rev'])) { + if (strstr($this->__uri($model, $params), '?rev')) $type = '&'; + else $type = '?'; + $params = $params . $type . 'rev=' . $queryData['conditions'][$model->alias . '.rev']; + } } $result = array(); $result[0][$model->alias] = $this->__decode($this->Socket->get($this->__uri($model, $params)), true); + return $this->__readResult($model, $queryData, $result); } @@ -252,28 +254,26 @@ private function __readResult($model, $queryData, $result) { $result[0][$model->alias]['id'] = $result[0][$model->alias]['_id']; $result[0][$model->alias]['rev'] = $result[0][$model->alias]['_rev']; - unset($result[0][$model->alias]['_id']); - unset($result[0][$model->alias]['_rev']); + unset($result[0][$model->alias]['_id'], $result[0][$model->alias]['_rev']); return $result; - } else if (isset($result[0][$model->alias]['rows'])) { + } elseif (isset($result[0][$model->alias]['rows'])) { $docs = array(); - foreach ($result[0][$model->alias]['rows'] as $k => $doc) { + foreach ($result[0][$model->alias]['rows'] as $k => $doc) { $docs[$k][$model->alias]['id'] = $doc['doc']['_id']; $docs[$k][$model->alias]['rev'] = $doc['doc']['_rev']; - unset($doc['doc']['_id']); - unset($doc['doc']['_rev']); - unset($doc['doc']['id']); - unset($doc['doc']['rev']); + unset($doc['doc']['_id'], $doc['doc']['_rev'], $doc['doc']['id'], $doc['doc']['rev']); foreach ($doc['doc'] as $field => $value) { $docs[$k][$model->alias][$field] = $value; } } + return $docs; } + return false; } @@ -286,8 +286,9 @@ private function __readResult($model, $queryData, $result) { * @param mixed $conditions * @return boolean Success. */ - public function update($model, $fields = null, $values = null, $conditions = null) { + public function update(Model $model, $fields = null, $values = null, $conditions = null) { $data = $model->data[$model->alias]; + if ($fields !== null && $values !== null) { $data = array_combine($fields, $values); } @@ -296,11 +297,14 @@ public function update($model, $fields = null, $values = null, $conditions = nul if (!empty($model->id)) { $result = $this->__decode($this->Socket->put($this->__uri($model, $model->id), $this->__encode($data))); + if ($this->__checkOk($result)) { $model->rev = $result->rev; + return true; } } + return false; } @@ -320,7 +324,7 @@ private function __idRevData(&$model, &$data) { if (isset($data['rev']) && !empty($data['rev'])) { $data['_rev'] = $data['rev']; unset($data['rev']); - } else if ($model->rev) { + } elseif ($model->rev) { $data['_rev'] = $model->rev; } else { $data['_rev'] = $this->__lastRevision($model, $model->id); @@ -336,6 +340,7 @@ private function __idRevData(&$model, &$data) { */ private function __lastRevision(&$model, $id) { $result = $this->__decode($this->Socket->get($this->__uri($model, $id))); + return $result->_rev; } @@ -346,16 +351,21 @@ private function __lastRevision(&$model, $id) { * @param mixed $conditions * @return boolean Success. */ - public function delete($model, $conditions = null) { + public function delete(Model $model, $conditions = null) { $id = $model->id; $rev = $model->rev; if (!empty($id)) { - if (empty($rev)) $rev = $this->__lastRevision($model, $id); - $id_rev = $id . '/?rev=' . $rev; - $result = $this->__decode($this->Socket->delete($this->__uri($model, $id_rev))); + if (empty($rev)) { + $rev = $this->__lastRevision($model, $id); + } + + $idRev = $id . '/?rev=' . $rev; + $result = $this->__decode($this->Socket->delete($this->__uri($model, $idRev))); + return $this->__checkOk($result); } + return false; } @@ -382,6 +392,7 @@ public function expression($expression) { $obj = new stdClass(); $obj->type = 'expression'; $obj->value = $expression; + return $obj; } @@ -390,10 +401,12 @@ public function expression($expression) { * * @param mixed $model * @param boolean $quote + * @param boolean $schema * @return string Full name of table. */ - public function fullTableName($model = null, $quote = true) { + public function fullTableName($model, $quote = true, $schema = true) { $table = null; + if (is_object($model)) { $table = $model->tablePrefix . $model->table; } elseif (isset($this->config['prefix'])) { @@ -401,6 +414,7 @@ public function fullTableName($model = null, $quote = true) { } else { $table = strval($model); } + return $table; } @@ -413,7 +427,7 @@ public function fullTableName($model = null, $quote = true) { * * The method can be performed by a Model of the following ways: * - * $this->Model->curlGet('_all_dbs'); + * $this->Model->curlGet('_all_dbs'); * $this->Model->curlPut('document_name'); * $this->Model->curlPost('document_name', array('field' => 'value')); * $this->Model->curlDelete('document_name'); @@ -421,7 +435,7 @@ public function fullTableName($model = null, $quote = true) { * $this->Model->curlPost('document_name', array('field' => 'value'), true , false); * * @param string $method - * @param array $params ParĂ¢metros aceitos na ordem: uri, data, decode, assoc + * @param array $params Accepted parameters in order: uri, data, decode, assoc * @return object */ public function query($method, $params) { @@ -431,11 +445,13 @@ public function query($method, $params) { 'method' => strtoupper(str_replace('curl', '', $method)) ); - if (!empty($uri)) + if (!empty($uri)) { $request['uri'] = '/' . $uri; + } - if (!empty($data)) + if (!empty($data)) { $request['body'] = $this->__encode($data); + } $result = $this->Socket->request($request); @@ -453,17 +469,29 @@ public function query($method, $params) { * @return array */ private function __queryParams($params) { - if (isset($params[0])) $uri = $params[0]; - else $uri = ''; + if (isset($params[0])) { + $uri = $params[0]; + } else { + $uri = ''; + } - if (isset($params[1])) $data = $params[1]; - else $data = array(); + if (isset($params[1])) { + $data = $params[1]; + } else { + $data = array(); + } - if (isset($params[2])) $decode = $params[2]; - else $decode = true; + if (isset($params[2])) { + $decode = $params[2]; + } else { + $decode = true; + } - if (isset($params[3])) $assoc = $params[3]; - else $assoc = true; + if (isset($params[3])) { + $assoc = $params[3]; + } else { + $assoc = true; + } return array($uri, $data, $decode, $assoc); } @@ -479,6 +507,7 @@ private function __uri($model = null, $params = null) { if (!is_null($params)) { $params = '/' . $params; } + return '/' . $this->fullTableName($model) . $params; } @@ -513,4 +542,3 @@ private function __checkOk($object = null) { return isset($object->ok) && $object->ok === true; } } -?> \ No newline at end of file diff --git a/README.md b/README.md index 3d1bed5..1f047eb 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,79 @@ # CouchDB datasource plugin for CakePHP +CouchDB datasource is a way to facilitate the communication from CakePHP application to CouchDB database. + DataSources are the link between models and the source of data that models represent. CouchDB is an open source document-oriented database written mostly in the Erlang programming language. ### Version -Written for CakePHP 2.1+ +Written for CakePHP 2.x + +### Copyright + +Copyright (c) 2011 Maury M. Marques +## Installation -### Installation +You can install this plugin using Composer, GIT Submodule, GIT Clone or Manually -You can clone the plugin into your project (or if you want you can use as a [submodule](http://help.github.com/submodules)): +_[Using [Composer](http://getcomposer.org/)]_ +Add the plugin to your project's `composer.json` - something like this: + +```javascript +{ + "require": { + "maurymmarques/couchdb-datasource-plugin": "dev-master" + }, + "extra": { + "installer-paths": { + "app/Plugin/CouchDB": ["maurymmarques/couchdb-datasource-plugin"] + } + } +} ``` -cd path/to/app/Plugin or /plugins +Then just run `composer install` + +Because this plugin has the type `cakephp-plugin` set in it's own `composer.json`, composer knows to install it inside your `/Plugin` directory, rather than in the usual vendors file. + +_[GIT Submodule]_ + +In your app directory (`app/Plugin`) type: + +```bash +git submodule add git://github.com/maurymmarques/couchdb-datasource.git Plugin/CouchDB +git submodule init +git submodule update +``` + +_[GIT Clone]_ + +In your plugin directory (`app/Plugin` or `plugins`) type: + +```bash git clone https://github.com/maurymmarques/couchdb-datasource.git CouchDB ``` +_[Manual]_ + +* Download the [CouchDB archive](https://github.com/maurymmarques/couchdb-datasource/archive/master.zip). +* Unzip that download. +* Rename the resulting folder to `CouchDB` +* Then copy this folder into `app/Plugin/` or `plugins` + +## Configuration + Bootstrap the plugin in app/Config/bootstrap.php: ```php -<?php CakePlugin::load('CouchDB'); ``` -### Configuration - Connection in app/Config/database.php: ```php -<?php class DATABASE_CONFIG { public $default = array( @@ -51,10 +94,32 @@ class DATABASE_CONFIG { The datasource works basically like CakePHP +### Creating a model + +```php +class Post extends AppModel { + + public $schema = array( + 'title' => array( + 'type' => 'string', + 'null' => true, + 'key' => 'primary', + 'length' => 32 + ) + ); + +} +``` + +You can set another CouchDB database name in your model using the attribute `Model::useTable` + +```php +public $useTable = 'posts'; +``` + ### Saving a document ```php -<?php $data = array('title' => 'My new title'); $this->Post->save($data); @@ -68,15 +133,20 @@ $this->Post->rev; ### Search for a document ```php -<?php $conditions = array('Post.id' => $this->Post->id); $result = $this->Post->find('first', compact('conditions')); ``` +### Search for a document by specific revision + +```php +$conditions = array('Post.id' => $this->Post->id, 'Post.rev' => $this->Post->rev); +$result = $this->Post->find('first', compact('conditions')); +``` + ### Change a document (changing the last revision) ```php -<?php $data = array('title' => 'My new title'); $this->Post->id = '8e64f1eadab2b3b32c94ef2scf3094420'; $this->Post->save($data); @@ -85,7 +155,6 @@ $this->Post->save($data); ### Change a document to a particular revision ```php -<?php $data = array('title' => 'My new title'); $this->Post->id = '8e64f1eadab2b3b32c94ef2scf3094420'; $this->Post->rev = '26-5cd5713759905feeee9b384edc4cfb61'; @@ -95,7 +164,6 @@ $this->Post->save($data); ### Deleting a document ```php -<?php $this->Post->id = '8e64f1eadab2b3b32c94ef2scf3094420'; $this->Post->delete($data); ``` @@ -105,7 +173,6 @@ $this->Post->delete($data); You can use the methods: curlGet, curlPost, curlPut, curlDelete ```php -<?php $post = array( 'source' => 'post', 'target' => 'post-replicate', diff --git a/Test/Case/Datasource/CouchDBSourceTest.php b/Test/Case/Datasource/CouchDBSourceTest.php old mode 100644 new mode 100755 index 3424cad..097f74a --- a/Test/Case/Datasource/CouchDBSourceTest.php +++ b/Test/Case/Datasource/CouchDBSourceTest.php @@ -1,37 +1,54 @@ <?php /** - * CouchDB DataSource Test file - * PHP version 5 + * CouchDB DataSource Test file. * * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) - * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) * * Licensed under The MIT License + * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project - * @package datasources - * @subpackage datasources.models.datasources - * @since CakePHP Datasources v 0.3 - * @license MIT License (http://www.opensource.org/licenses/mit-license.php) + * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://cakephp.org CakePHP(tm) Project + * @package CouchDB.Test.Case.Datasource + * @since CakePHP Datasources v 0.3 + * @license http://www.opensource.org/licenses/mit-license.php MIT License */ App::uses('AppModel', 'Model'); /** - * Post Model for the test - * - * @package app - * @subpackage app.model.post + * Post Model for the test. */ class Post extends AppModel { +/** + * Name of the model. + * + * @var string + */ public $name = 'Post'; - public $useDbConfig = 'couchdb_test'; + +/** + * Custom display field name. + * + * @var string + */ public $displayField = 'title'; + +/** + * Number of associations to recurse through during find calls. + * + * @var integer + */ public $recursive = -1; +/** + * List of validation rules. + * + * @var array + */ public $validate = array( 'title' => array( 'notempty' => array( @@ -45,6 +62,11 @@ class Post extends AppModel { ), ); +/** + * Field-by-field table metadata. + * + * @var array + */ public $schema = array( 'id' => array( 'type' => 'string', @@ -71,73 +93,73 @@ class Post extends AppModel { } /** - * CouchDBTestCase + * CouchDBTestCase. * - * @package datasources - * @subpackage datasources.tests.cases.models.datasources + * @package CouchDB.Test.Case.Datasource */ class CouchDBTestCase extends CakeTestCase { /** - * CouchDB Datasource object + * CouchDB Datasource object. * * @var object */ public $CouchDB = null; /** - * Configuration + * Configuration. * * @var array */ - protected $config = array( - 'datasource' => 'CouchDB.CouchDBSource', - 'persistent' => false, - 'host' => 'localhost', - 'port' => '5984', - 'login' => 'root', - 'password' => 'root', - 'database' => null, - 'prefix' => '' + protected $_config = array( + 'datasource' => 'CouchDB.CouchDBSource', + 'persistent' => false, + 'host' => 'localhost', + 'port' => '5984', + 'login' => 'root', + 'password' => '', + 'database' => null, + 'prefix' => '', ); /** - * Start Test + * Start Test. * * @return void */ - public function startTest() { + public function setUp() { config('database'); $config = new DATABASE_CONFIG(); if (isset($config->couchdb_test)) { - $this->config = $config->couchdb_test; + $this->_config = $config->couchdb_test; } - ConnectionManager::create('couchdb_test', $this->config); + ConnectionManager::create('couchdb_test', $this->_config); $this->Post = ClassRegistry::init('Post'); - $this->removeAllDocuments(); + $this->Post->useDbConfig = 'couchdb_test'; + $this->__removeAllDocuments(); } /** - * testConnection + * Test connection. * * @return void */ public function testConnection() { - $this->CouchDB = new CouchDBSource($this->config); - $this->CouchDB =& ConnectionManager::getDataSource($this->Post->useDbConfig); + $this->CouchDB = new CouchDBSource($this->_config); + $this->CouchDB = ConnectionManager::getDataSource($this->Post->useDbConfig); - $reconnect = $this->CouchDB->reconnect($this->config); - $this->assertIdentical($reconnect, true, __d('test_cases', 'Not reconnected')); + $reconnect = $this->CouchDB->reconnect($this->_config); + $this->assertSame($reconnect, true, __d('test_cases', 'Not reconnected')); $disconnect = $this->CouchDB->disconnect(); - $this->assertIdentical($disconnect, true, __d('test_cases', 'Not disconnect')); + $this->assertSame($disconnect, true, __d('test_cases', 'Not disconnect')); } /** - * testFind + * Test find. * * @return void */ @@ -149,20 +171,19 @@ public function testFind() { $this->Post->save($data); $result = $this->Post->find('all'); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); $resultData = $result[0]['Post']; - $this->assertEqual(4, count($resultData)); + $this->assertEquals(4, count($resultData)); $this->assertTrue(!empty($resultData['id'])); - $this->assertEqual($this->Post->id, $resultData['id']); - $this->assertEqual($this->Post->rev, $resultData['rev']); - $this->assertEqual($data['title'], $resultData['title']); - $this->assertEqual($data['description'], $resultData['description']); + $this->assertEquals($this->Post->id, $resultData['id']); + $this->assertEquals($this->Post->rev, $resultData['rev']); + $this->assertEquals($data['title'], $resultData['title']); + $this->assertEquals($data['description'], $resultData['description']); } - /** - * testFindConditions + * Test find conditions. * * @return void */ @@ -177,17 +198,17 @@ public function testFindConditions() { $this->Post->save($data); $result = $this->Post->find('all'); - $this->assertEqual(2, count($result)); + $this->assertEquals(2, count($result)); $result = $this->Post->find('all', array('conditions' => array('Post.id' => $this->Post->id))); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); $result = $this->Post->find('all', array('conditions' => array('id' => $this->Post->id))); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); } /** - * testFindRevs + * Test find revs. * * @return void */ @@ -201,7 +222,7 @@ public function testFindRevs() { $this->Post->recursive = 0; $result = $this->Post->find('all', array('conditions' => array('id' => $this->Post->id))); - $this->assertEqual(2, count($result[0]['Post']['_revs_info'])); + $this->assertEquals(2, count($result[0]['Post']['_revs_info'])); } /** @@ -217,18 +238,18 @@ public function testSave() { $this->Post->create(); $saveResult = $this->Post->save($data); - $this->assertIdentical(is_array($saveResult), true); + $this->assertSame(is_array($saveResult), true); $result = $this->Post->find('all'); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); $resultData = $result[0]['Post']; - $this->assertEqual(4, count($resultData)); + $this->assertEquals(4, count($resultData)); $this->assertTrue(!empty($resultData['id'])); - $this->assertEqual($this->Post->id, $resultData['id']); - $this->assertEqual($this->Post->rev, $resultData['rev']); - $this->assertEqual($data['title'], $resultData['title']); - $this->assertEqual($data['description'], $resultData['description']); + $this->assertEquals($this->Post->id, $resultData['id']); + $this->assertEquals($this->Post->rev, $resultData['rev']); + $this->assertEquals($data['title'], $resultData['title']); + $this->assertEquals($data['description'], $resultData['description']); } /** @@ -245,19 +266,19 @@ public function testSaveWithId() { $this->Post->create(); $saveResult = $this->Post->save($data); - $this->assertIdentical(is_array($saveResult), true); + $this->assertSame(is_array($saveResult), true); $result = $this->Post->find('all'); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); $resultData = $result[0]['Post']; - $this->assertEqual(4, count($resultData)); + $this->assertEquals(4, count($resultData)); $this->assertTrue(!empty($resultData['id'])); - $this->assertEqual($resultData['id'], $data['id']); - $this->assertEqual($this->Post->id, $resultData['id']); - $this->assertEqual($this->Post->rev, $resultData['rev']); - $this->assertEqual($data['title'], $resultData['title']); - $this->assertEqual($data['description'], $resultData['description']); + $this->assertEquals($resultData['id'], $data['id']); + $this->assertEquals($this->Post->id, $resultData['id']); + $this->assertEquals($this->Post->rev, $resultData['rev']); + $this->assertEquals($data['title'], $resultData['title']); + $this->assertEquals($data['description'], $resultData['description']); } /** @@ -280,19 +301,19 @@ public function testSaveAll() { $saveResult = $this->Post->saveAll($data); $result = $this->Post->find('all'); - $this->assertEqual(2, count($result)); + $this->assertEquals(2, count($result)); $resultData = $result[0]['Post']; - $this->assertEqual(4, count($resultData)); + $this->assertEquals(4, count($resultData)); $this->assertTrue(!empty($resultData['id'])); - $this->assertEqual($data[0]['Post']['title'], $resultData['title']); - $this->assertEqual($data[0]['Post']['description'], $resultData['description']); + $this->assertEquals($data[0]['Post']['title'], $resultData['title']); + $this->assertEquals($data[0]['Post']['description'], $resultData['description']); $resultData = $result[1]['Post']; - $this->assertEqual(4, count($resultData)); + $this->assertEquals(4, count($resultData)); $this->assertTrue(!empty($resultData['id'])); - $this->assertEqual($data[1]['Post']['title'], $resultData['title']); - $this->assertEqual($data[1]['Post']['description'], $resultData['description']); + $this->assertEquals($data[1]['Post']['title'], $resultData['title']); + $this->assertEquals($data[1]['Post']['description'], $resultData['description']); } /** @@ -309,27 +330,30 @@ public function updateTest() { ); $mapReduce = $this->Post->query($uri, $post); - if(isset($mapReduce->rows[0]->value)) $count0 = $mapReduce->rows[0]->value; - else $count0 = 0; - $count1 = $this->updateTest1($uri, $post, $count0); - $count2 = $this->updateTest2($uri, $post, $count1); - $count3 = $this->updateTest3($uri, $post, $count2); - $count4 = $this->updateTest4($uri, $post, $count2); - $updateData = $this->updateTest5($uri, $post, $count4); + if (isset($mapReduce->rows[0]->value)) { + $count0 = $mapReduce->rows[0]->value; + } else { + $count0 = 0; + } + + $count1 = $this->__updateTest1($uri, $post, $count0); + $count2 = $this->__updateTest2($uri, $post, $count1); + $count3 = $this->__updateTest3($uri, $post, $count2); + $count4 = $this->__updateTest4($uri, $post, $count2); + $updateData = $this->__updateTest5($uri, $post, $count4); // Final test $result = $this->Post->find('all'); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); $resultData = $result[0]['Post']; - $this->assertEqual(4, count($resultData)); + $this->assertEquals(4, count($resultData)); $this->assertTrue(!empty($resultData['id'])); - $this->assertEqual($this->Post->id, $resultData['id']); - $this->assertEqual($this->Post->rev, $resultData['rev']); - $this->assertNotEqual($updateData['title'], $resultData['title']); - $this->assertNotEqual($updateData['description'], $resultData['description']); - + $this->assertEquals($this->Post->id, $resultData['id']); + $this->assertEquals($this->Post->rev, $resultData['rev']); + $this->assertNotEquals($updateData['title'], $resultData['title']); + $this->assertNotEquals($updateData['description'], $resultData['description']); } /** @@ -337,10 +361,10 @@ public function updateTest() { * * @param string $uri * @param array $post - * @param interger $previousCount - * @return void + * @param integer $previousCount + * @return integer */ - private function updateTest1($uri, $post, $previousCount) { + private function __updateTest1($uri, $post, $previousCount) { $data = array( 'title' => 'My first post', 'description' => 'My first post' @@ -348,13 +372,13 @@ private function updateTest1($uri, $post, $previousCount) { $this->Post->create(); $saveResult = $this->Post->save($data); - $this->assertIdentical(is_array($saveResult), true); - $this->assertIdentical(!empty($this->Post->id), true); + $this->assertSame(is_array($saveResult), true); + $this->assertSame(!empty($this->Post->id), true); $mapReduce = $this->Post->curlPost($uri, $post); $count1 = $mapReduce['rows'][0]['value']; - $this->assertIdentical($count1 - $previousCount, 1); + $this->assertSame($count1 - $previousCount, 1); return $count1; } @@ -364,12 +388,12 @@ private function updateTest1($uri, $post, $previousCount) { * * @param string $uri * @param array $post - * @param interger $previousCount - * @return void + * @param integer $previousCount + * @return integer */ - private function updateTest2($uri, $post, $previousCount) { + private function __updateTest2($uri, $post, $previousCount) { $findResult = $this->Post->find('first'); - $this->assertEqual(4, count($findResult['Post'])); + $this->assertEquals(4, count($findResult['Post'])); $updateData = array( 'title' => 'My post update', @@ -379,12 +403,12 @@ private function updateTest2($uri, $post, $previousCount) { $this->Post->id = $findResult['Post']['id']; $this->Post->rev = $findResult['Post']['rev']; $saveResult = $this->Post->save($updateData); - $this->assertIdentical(is_array($saveResult), true); + $this->assertSame(is_array($saveResult), true); $mapReduce = $this->Post->curlPost($uri, $post); $count2 = $mapReduce['rows'][0]['value']; - $this->assertIdentical($count2 - $previousCount, 0); + $this->assertSame($count2 - $previousCount, 0); return $count2; } @@ -394,12 +418,12 @@ private function updateTest2($uri, $post, $previousCount) { * * @param string $uri * @param array $post - * @param interger $previousCount - * @return void + * @param integer $previousCount + * @return integer */ - private function updateTest3($uri, $post, $previousCount) { + private function __updateTest3($uri, $post, $previousCount) { $findResult = $this->Post->find('first'); - $this->assertEqual(4, count($findResult['Post'])); + $this->assertEquals(4, count($findResult['Post'])); $updateData = array( 'id' => $findResult['Post']['id'], @@ -409,13 +433,13 @@ private function updateTest3($uri, $post, $previousCount) { $this->Post->rev = $findResult['Post']['rev']; $saveResult = $this->Post->save($updateData); - $this->assertIdentical(is_array($saveResult), true); - $this->assertIdentical($this->Post->id, $findResult['Post']['id']); + $this->assertSame(is_array($saveResult), true); + $this->assertSame($this->Post->id, $findResult['Post']['id']); $mapReduce = $this->Post->curlPost($uri, $post); $count3 = $mapReduce['rows'][0]['value']; - $this->assertIdentical($count3 - $previousCount, 0); + $this->assertSame($count3 - $previousCount, 0); return $count3; } @@ -425,12 +449,12 @@ private function updateTest3($uri, $post, $previousCount) { * * @param string $uri * @param array $post - * @param interger $previousCount - * @return void + * @param integer $previousCount + * @return integer */ - private function updateTest4($uri, $post, $previousCount) { + private function __updateTest4($uri, $post, $previousCount) { $findResult = $this->Post->find('first'); - $this->assertEqual(4, count($findResult['Post'])); + $this->assertEquals(4, count($findResult['Post'])); $updateData = array( 'id' => $findResult['Post']['id'], @@ -440,13 +464,13 @@ private function updateTest4($uri, $post, $previousCount) { ); $saveResult = $this->Post->save($updateData); - $this->assertIdentical(is_array($saveResult), true); - $this->assertIdentical($this->Post->id, $findResult['Post']['id']); + $this->assertSame(is_array($saveResult), true); + $this->assertSame($this->Post->id, $findResult['Post']['id']); $mapReduce = $this->Post->curlPost($uri, $post); $count4 = $mapReduce['rows'][0]['value']; - $this->assertIdentical($count4 - $previousCount, 0); + $this->assertSame($count4 - $previousCount, 0); return $count4; } @@ -456,12 +480,12 @@ private function updateTest4($uri, $post, $previousCount) { * * @param string $uri * @param array $post - * @param interger $previousCount - * @return void + * @param integer $previousCount + * @return integer */ - private function updateTest5($uri, $post, $previousCount) { + private function __updateTest5($uri, $post, $previousCount) { $findResult = $this->Post->find('first'); - $this->assertEqual(4, count($findResult['Post'])); + $this->assertEquals(4, count($findResult['Post'])); $updateData = array( 'id' => $findResult['Post']['id'], @@ -472,18 +496,18 @@ private function updateTest5($uri, $post, $previousCount) { $saveResult = $this->Post->save($updateData); $this->assertFalse($saveResult); - $this->assertIdentical($this->Post->id, $findResult['Post']['id']); + $this->assertSame($this->Post->id, $findResult['Post']['id']); $mapReduce = $this->Post->curlPost($uri, $post); $count5 = $mapReduce['rows'][0]['value']; - $this->assertIdentical($count5 - $previousCount, 0); + $this->assertSame($count5 - $previousCount, 0); - return $updateData; + return $count5; } /** - * Test update without revision + * Test update without revision. * * @return void */ @@ -503,8 +527,8 @@ public function testUpdateWithoutRevision() { $updateResult = $this->Post->save($result); - $this->assertIdentical(is_array($updateResult), true); - $this->assertIdentical($this->Post->id, $saveResult['Post']['id']); + $this->assertSame(is_array($updateResult), true); + $this->assertSame($this->Post->id, $saveResult['Post']['id']); } /** @@ -522,18 +546,18 @@ public function testDelete() { $saveResult = $this->Post->save($data); $result = $this->Post->find('all'); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); $this->Post->id = $result[0]['Post']['id']; $this->Post->rev = $result[0]['Post']['rev']; $this->Post->delete(); $result = $this->Post->find('all'); - $this->assertEqual(0, count($result)); + $this->assertEquals(0, count($result)); } /** - * Test delete without revision + * Test delete without revision. * * @return void */ @@ -547,7 +571,7 @@ public function testDeleteWithoutRevision() { $saveResult = $this->Post->save($data); $result = $this->Post->find('all'); - $this->assertEqual(1, count($result)); + $this->assertEquals(1, count($result)); unset($result['Post']['rev']); unset($this->Post->rev); @@ -555,7 +579,7 @@ public function testDeleteWithoutRevision() { $this->Post->delete(); $result = $this->Post->find('all'); - $this->assertEqual(0, count($result)); + $this->assertEquals(0, count($result)); } /** @@ -566,7 +590,7 @@ public function testDeleteWithoutRevision() { public function testQuery() { // GET $result = $this->Post->curlGet('_all_dbs'); - $this->assertIdentical(is_array($result), true); + $this->assertSame(is_array($result), true); // POST $data = array( @@ -574,8 +598,8 @@ public function testQuery() { 'description' => 'My first post' ); - $result = $this->Post->curlPost('/posts', $data); - $this->assertIdentical($result['ok'], true); + $result = $this->Post->curlPost('/posts', $data); + $this->assertSame($result['ok'], true); // PUT $data = array( @@ -584,22 +608,23 @@ public function testQuery() { 'description' => 'My first update' ); - $result = $this->Post->curlPut('/posts/' . $result['id'], $data); - $this->assertIdentical($result['ok'], true); + $result = $this->Post->curlPut('/posts/' . $result['id'], $data); + $this->assertSame($result['ok'], true); // DELETE $result = $this->Post->curlDelete('/posts/' . $result['id'] . '/?rev=' . $result['rev']); - $this->assertIdentical($result['ok'], true); + $this->assertSame($result['ok'], true); } /** - * Remove all documents from database + * Remove all documents from database. * * @return void */ - private function removeAllDocuments() { + private function __removeAllDocuments() { $posts = $this->Post->find('list', array('fields' => array('Post.rev'))); - foreach($posts as $id => $post) { + + foreach ($posts as $id => $post) { $this->Post->rev = $post; $this->Post->delete($id); } @@ -610,8 +635,8 @@ private function removeAllDocuments() { * * @return void */ - public function endTest() { - $this->removeAllDocuments(); + public function tearDown() { + $this->__removeAllDocuments(); unset($this->Post); unset($this->CouchDB); ClassRegistry::flush(); diff --git a/composer.json b/composer.json index db84230..b570667 100644 --- a/composer.json +++ b/composer.json @@ -1,12 +1,25 @@ { - "name": "maurymmarques/couchdb-datasource-cakephp", - "license": "MIT", + "name": "maurymmarques/couchdb-datasource-plugin", + "description": "CouchDB datasource is a CakePHP plugin to facilitate the communication from CakePHP application to CouchDB database.", "type": "cakephp-plugin", - "version": "1.0.0", + "keywords": ["cakephp", "couchdb", "datasource", "plugin"], + "homepage": "https://github.com/maurymmarques/couchdb-datasource-cakephp", + "license": "MIT", + "authors": [ + { + "name": "Maury M. Marques", + "role": "Author" + } + ], + "support": { + "issues": "https://github.com/maurymmarques/couchdb-datasource-cakephp/issues", + "source": "https://github.com/maurymmarques/couchdb-datasource-cakephp" + }, "require": { + "php": ">=5.3.0", "composer/installers": "*" }, - "extra": { - "installer-name": "Couchdb" + "extra": { + "installer-name": "CouchDB" } -} \ No newline at end of file +}