Add memory docs and test

This commit is contained in:
Ritchie Martori 2013-07-16 13:39:03 -07:00
parent d128ed4386
commit cba94a23fc
2 changed files with 144 additions and 13 deletions

122
README.md
View File

@ -205,10 +205,56 @@ Attach a model to a [DataSource](#data-source). Attaching a [DataSource](#data-s
#### CRUD and Query Mixins #### CRUD and Query Mixins
Mixins are added by attaching a vanilla model to a data source with a connector. Each [connector](#connectors) enables its own set of operations that are attached to a `Model` as methods. To see available methods for a data source with a connector call `dataSource.operations()`. Mixins are added by attaching a vanilla model to a [data source](#data-source) with a [connector](#connectors). Each [connector](#connectors) enables its own set of operations that are mixed into a `Model` as methods. To see available methods for a data source call `dataSource.operations()`.
Log the available methods for a memory data source.
var ops = loopback
.createDataSource({connector: loopback.Memory})
.operations();
console.log(Object.keys(ops));
Outputs:
[ 'create',
'updateOrCreate',
'upsert',
'findOrCreate',
'exists',
'findById',
'find',
'all',
'findOne',
'destroyAll',
'deleteAll',
'count',
'include',
'relationNameFor',
'hasMany',
'belongsTo',
'hasAndBelongsToMany',
'save',
'isNewRecord',
'destroy',
'delete',
'updateAttribute',
'updateAttributes',
'reload' ]
Here is the definition of the `count()` operation.
{
accepts: [ { arg: 'where', type: 'object' } ],
http: { verb: 'get', path: '/count' },
remoteEnabled: true,
name: 'count'
}
#### Static Methods #### Static Methods
**Note:** These are the default mixin methods for a `Model` attached to a data source. See the specific connector for additional API documentation.
##### Model.create(data, [callback]) ##### Model.create(data, [callback])
Create an instance of Model with given data and save to the attached data source. Callback is optional. Create an instance of Model with given data and save to the attached data source. Callback is optional.
@ -310,6 +356,8 @@ Setup the static model method to be exposed to clients as a [remote method](#rem
#### Instance Methods #### Instance Methods
**Note:** These are the default mixin methods for a `Model` attached to a data source. See the specific connector for additional API documentation.
##### model.save([options], [callback]) ##### model.save([options], [callback])
Save an instance of a Model to the attached data source. Save an instance of a Model to the attached data source.
@ -361,13 +409,18 @@ Both instance and static methods can be exposed to clients. A remote method must
Expose a remote method. Expose a remote method.
Product.stats = function(fn) { Product.stats = function(fn) {
myApi.getStats('products', fn); var calc = require('./stats');
Product.find(function(err, products) {
var productStats = calc(products);
fn(null, productStats);
});
} }
loopback.remoteMethod( loopback.remoteMethod(
Product.stats, Product.stats,
{ {
returns: {arg: 'stats', type: 'array'}, returns: {arg: 'stats', type: 'object'},
http: {path: '/info', verb: 'get'} http: {path: '/info', verb: 'get'}
} }
); );
@ -715,16 +768,16 @@ Create a data source with a specific connector. See **available connectors** for
**Available Connectors** **Available Connectors**
- [Oracle](http://github.com/strongloop/loopback-connectors/oracle) - [In Memory](#memory-connector)
- [In Memory](http://github.com/strongloop/loopback-connectors/memory) - [REST](http://github.com/strongloop/loopback-connector-rest)
- TODO - [REST](http://github.com/strongloop/loopback-connectors/rest) - [Oracle](http://github.com/strongloop/loopback-connector-oracle)
- TODO - [MySQL](http://github.com/strongloop/loopback-connectors/mysql) - [MongoDB](http://github.com/strongloop/loopback-connector-mongodb)
- TODO - [SQLite3](http://github.com/strongloop/loopback-connectors/sqlite) - TODO - [MySQL](http://github.com/strongloop/loopback-connector-mysql)
- TODO - [Postgres](http://github.com/strongloop/loopback-connectors/postgres) - TODO - [SQLite3](http://github.com/strongloop/loopback-connector-sqlite)
- TODO - [Redis](http://github.com/strongloop/loopback-connectors/redis) - TODO - [Postgres](http://github.com/strongloop/loopback-connector-postgres)
- TODO - [MongoDB](http://github.com/strongloop/loopback-connectors/mongo) - TODO - [Redis](http://github.com/strongloop/loopback-connector-redis)
- TODO - [CouchDB](http://github.com/strongloop/loopback-connectors/couch) - TODO - [CouchDB](http://github.com/strongloop/loopback-connector-couch)
- TODO - [Firebird](http://github.com/strongloop/loopback-connectors/firebird) - TODO - [Firebird](http://github.com/strongloop/loopback-connector-firebird)
**Installing Connectors** **Installing Connectors**
@ -736,6 +789,49 @@ Include the connector in your package.json dependencies and run `npm install`.
} }
} }
##### Memory Connector
The built-in memory connector allows you to test your application without connecting to an actual persistent data source, such as a database. Although the memory connector is very well tested it is not recommended to be used in production. Creating a data source using the memory connector is very simple.
// use the built in memory function
// to create a memory data source
var memory = loopback.memory();
// or create it using the standard
// data source creation api
var memory = loopback.createDataSource({
connector: loopback.Memory
});
// create a model using the
// memory data source
var properties = {
name: String,
price: Number
};
var Product = memory.createModel('product', properties);
Product.create([
{name: 'apple', price: 0.79},
{name: 'pear', price: 1.29},
{name: 'orange', price: 0.59},
], count);
function count() {
Product.count(console.log); // 3
}
###### Operations
**CRUD / Query**
The memory connector supports all the standard [query and crud operations](#crud-and-query-mixins) to allow you to test your models against an in memory data source.
**GeoPoint Filtering**
The memory connector also supports geo-filtering when using the `find()` operation with an attached model. See [GeoPoint](#geopoint) for more information on geo-filtering.
### GeoPoint ### GeoPoint
Use the `GeoPoint` class. Use the `GeoPoint` class.

35
test/memory.test.js Normal file
View File

@ -0,0 +1,35 @@
describe('Memory Connector', function(){
it('Create a model using the memory connector', function(done) {
// use the built in memory function
// to create a memory data source
var memory = loopback.memory();
// or create it using the standard
// data source creation api
var memory = loopback.createDataSource({
connector: loopback.Memory
});
// create a model using the
// memory data source
var properties = {
name: String,
price: Number
};
var Product = memory.createModel('product', properties);
Product.create([
{name: 'apple', price: 0.79},
{name: 'pear', price: 1.29},
{name: 'orange', price: 0.59},
], count);
function count() {
Product.count(function (err, count) {
assert.equal(count, 3);
done();
});
}
});
});