{"_id":"tubbs","_rev":"25-ae8fc3bde6c8abdc28edb1a80bd0b8b8","name":"tubbs","description":"Models with an API that I actually like.","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Data Model Layer which makes working with your data much easier","version":"0.0.1","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"expresso","prepublish":"npm prune"},"engines":{"node":">= 0.4.0"},"dependencies":{"guid":"*","riak-js":"*"},"devDependencies":{"expresso":"*"},"keywords":["data","model","mustache","riak","orm","nosql","json"],"_npmJsonOpts":{"file":"/Users/dand/.npm/tubbs/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"tubbs@0.0.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"7bbff6233d143a31ac1a5d4fd7bafb96e8dc671c","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.1.tgz","integrity":"sha512-vLN3CDGxuJ3LxjXulyKuPXdNCgsjYJ7+09zPlQdDso3WG5jMJyOVy9rgU1WzfuCaysR+z6y2U1zA2rsRFIRgfw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICEHT/MuVk/ODkTO1ll8+0YMo/WMfPRIop16zu1aJfmBAiEApjD1VyF3WJc37wfx6pWJLirfepM7zRC0ZSq7mP/R8Rs="}]}},"0.0.2":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Data Model Layer which makes working with your data much easier","version":"0.0.2","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"expresso","prepublish":"npm prune"},"engines":{"node":">= 0.4.0"},"dependencies":{"guid":"*","riak-js":"*"},"devDependencies":{"expresso":"*"},"keywords":["data","model","mustache","riak","orm","nosql","json"],"_npmJsonOpts":{"file":"/Users/dand/.npm/tubbs/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"tubbs@0.0.2","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"67aa8b6d0a69afbb3c887ab86651705bffcd8d01","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.2.tgz","integrity":"sha512-7pXheIRdYfR8xDJt35WrvpN08vkIHzCDq9t8GnGuHp8P57KJK0wRVIPeRGASouTfVSHCGBQhEeqdafhm+Pa1lg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDfKLlwEM12F6vQRMw7+n37zqCr6nzZ7LU86f4m/FtyuAiEAuhfSeSYZjJj6Zx2pFgpRxh9JNDKzTY+V09VUifgv7hI="}]}},"0.0.3":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Data Model Layer which makes working with your data much easier","version":"0.0.3","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"expresso","prepublish":"npm prune"},"engines":{"node":">= 0.4.0"},"dependencies":{"guid":"*","riak-js":"*"},"devDependencies":{"expresso":"*"},"keywords":["data","model","mustache","riak","orm","nosql","json"],"_npmJsonOpts":{"file":"/Users/dand/.npm/tubbs/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"tubbs@0.0.3","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d0ef17d5b123e0ac0f1b1b5cddec8bba28b01746","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.3.tgz","integrity":"sha512-sAZ0C5vvxK4vZtdPMsK0P6Cspg0Kfmm10B03HrilWfszHJ9aTsupvuzqSUVO6A/5t1YfixrkvZl6fJoAsMlhyg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpnuT1uixYL7SY+8HcdjC3ynw3segWKTuRvgYJOwE+zgIhAOl7rj6rVFU6qKDqSpZB0Y4Ut93aUSSHOoIMTA8xsTlK"}]},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.0.4":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Data Model Layer which makes working with your data much easier","version":"0.0.4","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"expresso","prepublish":"npm prune"},"engines":{"node":">= 0.4.0"},"dependencies":{"guid":"*","riak-js":"*"},"devDependencies":{"expresso":"*"},"keywords":["data","model","mustache","riak","orm","nosql","json"],"_npmUser":{"name":"dandean","email":"me@dandean.com"},"_id":"tubbs@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"598e69d631be7c23354809b783149eba7639f077","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.4.tgz","integrity":"sha512-zKrJ3XDTtec8y8wGfVOdGIyMTUTjl7vooMTePtWeXbQBhVfyjM64e1cTV1DyALDMqbZIXld7WerNtjREXrZurA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4fj7cqt1J7U3BkRjGOWdW9sEBkYCSdxEh0YXCon6CGgIhAILm4JMFP0yoYOm+jffFNMWilHHOa1kA42IjFph42rMw"}]},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.0.6":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.0.6","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"make test","prepublish":"npm prune"},"dependencies":{"guid":"*","eventemitter2":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","mustache","validation","validate","nosql","json"],"readme":"Tubbs\n=====\n\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* Configurable default property values\n* Virtual (non-serialized) properties\n* ActiveModel-style validation\n* Observe property value changes\n* Observe creation and deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nvar User = Tubbs.define({\n\n  // Persist our data with an in-memory store:\n  dataStore: { type: Tubbs.MemoryStore },\n\n  fields: {\n    username: undefined,\n    first: '',\n    last: '',\n  },\n\n  virtual: {\n    name: function() {\n      return ((this.first || '') + ' ' + (this.last || '')).trim();\n    }\n  },\n\n  validation: [\n    Tubbs.Validate.required(\"username\"),\n    Tubbs.Validate.lengthOf(\"username\", { min: 5 })\n  ]\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('new', function(instance) {\n  // When any User model is created.\n});\n\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.0.6","dist":{"shasum":"b9e87abb72328a8b1c874da7cbde042fcf866173","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.6.tgz","integrity":"sha512-2zTlIUdJJlW0OTNdfipvl5Po1Faf1Pb1E4A8N3tk11xjsz+unG1efvguEBHSHhZRRj2xIyKmOqxWsSl+BbD7Ew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE37+e02U5gE40JHlZ3JIe41wDWkur8hlQyMxzIAp5uQAiAeTIZqVr+/kyhFPX7HrAl8MVx7WkL/neCI3zX4fL4YPg=="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.0.7":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.0.7","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"make test","prepublish":"npm prune"},"dependencies":{"guid":"*","eventemitter2":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","mustache","validation","validate","nosql","json"],"readme":"Tubbs\n=====\n\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* Configurable default property values\n* Virtual (non-serialized) properties\n* ActiveModel-style validation\n* Observe property value changes\n* Observe creation and deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nvar User = Tubbs.define({\n\n  // Persist our data with an in-memory store:\n  dataStore: { type: Tubbs.MemoryStore },\n\n  fields: {\n    username: undefined,\n    first: '',\n    last: '',\n  },\n\n  virtual: {\n    name: function() {\n      return ((this.first || '') + ' ' + (this.last || '')).trim();\n    }\n  },\n\n  validation: [\n    Tubbs.Validate.required(\"username\"),\n    Tubbs.Validate.lengthOf(\"username\", { min: 5 })\n  ]\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('new', function(instance) {\n  // When any User model is created.\n});\n\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.0.7","dist":{"shasum":"ad4b40fc4b21e00afc08c967b473ca6684ac7c70","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.7.tgz","integrity":"sha512-gEF8UYSOAQxSrALMxfF1owtQ7MIoL8wWzRO/GcuYCiRtCGQDsFK/tS83ld/DfBoXhGvBWzl8EImxR1HCSNEIRQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0I27Vql66P7WwdN7EGNBkLl+j2pHHGfCFv5Ebzau5ywIgQueBGPz7UxZkYiTUvxXocmLx9xcDkPzYkHOB93bsydc="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.0.8":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.0.8","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"make test","prepublish":"npm prune"},"dependencies":{"guid":"*","eventemitter2":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","mustache","validation","validate","nosql","json"],"readme":"Tubbs\n=====\n\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* Configurable default property values\n* Virtual (non-serialized) properties\n* ActiveModel-style validation\n* Observe property value changes\n* Observe creation and deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nvar User = Tubbs.define({\n\n  // Persist our data with an in-memory store:\n  dataStore: { type: Tubbs.MemoryStore },\n\n  fields: {\n    username: undefined,\n    first: '',\n    last: '',\n  },\n\n  virtual: {\n    name: function() {\n      return ((this.first || '') + ' ' + (this.last || '')).trim();\n    }\n  },\n\n  validation: [\n    Tubbs.Validate.required(\"username\"),\n    Tubbs.Validate.lengthOf(\"username\", { min: 5 })\n  ]\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('new', function(instance) {\n  // When any User model is created.\n});\n\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.0.8","dist":{"shasum":"1af4b6bb83855a2bdfa90e489c3ecd4727e8e4e8","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.8.tgz","integrity":"sha512-NxwpqLxRpQemV2tvMkcSLAxCIR1qnM1aWinW3/AA+qZge2q2UfpubsLqFE8htUijcz6o4AEm3uidxYO9xkCOeA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzWK/El5tOp/v4F5/6HG6W2XE0Ko9bwrpdH2H3wDMCWAIgdCR2a4Fm3hD74vy1jNxQHq9IdRtcK5EelkxTtiR9qBM="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.0.9":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.0.9","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"make test","prepublish":"npm prune"},"dependencies":{"guid":"*","eventemitter2":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","mustache","validation","validate","nosql","json"],"readme":"Tubbs\n=====\n\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* Configurable default property values\n* Virtual (non-serialized) properties\n* ActiveModel-style validation\n* Observe property value changes\n* Observe creation and deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nvar User = Tubbs.define({\n\n  // Persist our data with an in-memory store:\n  dataStore: { type: Tubbs.MemoryStore },\n\n  fields: {\n    username: undefined,\n    first: '',\n    last: '',\n  },\n\n  virtual: {\n    name: function() {\n      return ((this.first || '') + ' ' + (this.last || '')).trim();\n    }\n  },\n\n  validation: [\n    Tubbs.Validate.required(\"username\"),\n    Tubbs.Validate.lengthOf(\"username\", { min: 5 })\n  ]\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('new', function(instance) {\n  // When any User model is created.\n});\n\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.0.9","dist":{"shasum":"5997aa66bac49602b7b23ddffae3eb3c666a7a70","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.0.9.tgz","integrity":"sha512-RpM1yK07gy2WO5n2F1bkAFFKnf7pWeksbGMAGzW0bnrqGEDyrQ7sTnnXTRlFI2dbXjPecKfD1VuUdas/0lLnRQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsiebqUywyXkCQfS16LwQ2KPHTYysJMMbqdqOW7I7AAQIgZ4aC1RbODa6+tDfg2gV8TWMXTsn9RAyKwf/tVykdmbk="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.1.1":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.1.1","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"mocha"},"dependencies":{"emitter-component":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","validation","validate","nosql","json"],"license":"MIT","readme":"Tubbs\n=====\n\n![Build Status](https://travis-ci.org/dandean/tubbs.png)\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* ActiveModel-style validation\n* Observe property value changes\n* Observe deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nfunction User(data) {\n  this.setData(data);\n}\n\nTubbs(User, {\n  dataStore: new Memory(User),\n  basicProperties: ['username', 'first', 'last'],\n  validation: [\n    Validate.required(\"username\"),\n    Validate.lengthOf(\"username\", { min: 5 })\n  ],\n});\n\nObject.defineProperty(User, 'name', {\n  get: function() {\n    return ((this.first || '') + ' ' + (this.last || '')).trim();\n  },\n  enumerable: true\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.1.1","dist":{"shasum":"7e9802cadaa271e7b2c32ffa2e56cf2343f8f98c","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.1.1.tgz","integrity":"sha512-VLZsVNvfQrdT8lLcjnufjxIM2pPCepmj/3eAdwjL6jYY4pTjI3ge6IHiPDjP5GMZIXehxm4zgcqBQJDP7flcAQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID4X3mvdj8PKDnDsinRHBTHWs9tw+dSBI4/AdXCTeqQ3AiEA8EXxScmjiO0QUfH6S0mhHGRDvDI/qU+gdl6aP9P/tUo="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.1.2":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.1.2","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"mocha"},"dependencies":{"emitter-component":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","validation","validate","nosql","json"],"license":"MIT","readme":"Tubbs\n=====\n\n![Build Status](https://travis-ci.org/dandean/tubbs.png)\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* ActiveModel-style validation\n* Observe property value changes\n* Observe deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nfunction User(data) {\n  this.setData(data);\n}\n\nTubbs(User, {\n  dataStore: new Memory(User),\n  basicProperties: ['username', 'first', 'last'],\n  validation: [\n    Validate.required(\"username\"),\n    Validate.lengthOf(\"username\", { min: 5 })\n  ],\n});\n\nObject.defineProperty(User, 'name', {\n  get: function() {\n    return ((this.first || '') + ' ' + (this.last || '')).trim();\n  },\n  enumerable: true\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.1.2","dist":{"shasum":"7a4032c2349fdb89ed0fcccd03a1bba32d9e4aee","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.1.2.tgz","integrity":"sha512-Wn0+Bboq72e4Xyk9eJaHczsRf7apMdMbJ7E7AdVveUZKPNJB7xK7xJW9xFkRMyyY8lpz2JzYAc/xhpma13XD0A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFxjbfHfYLyHzajF+Nfntu0wZqwFLyRaos7f6F8iwCX8AiEA08olcFfmO37kziuBLNpNkpevsVUTgPRSN0wwffX2u0U="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.1.3":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"tubbs","description":"Models with an API that I actually like.","version":"0.1.3","repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"},"main":"index","scripts":{"test":"mocha"},"dependencies":{"emitter-component":"*"},"devDependencies":{"mocha":"*"},"keywords":["data","model","validation","validate","nosql","json"],"license":"MIT","readme":"Tubbs\n=====\n\n![Build Status](https://travis-ci.org/dandean/tubbs.png)\n\n**Tubbs** is Data Model Layer which makes working with your data much easier.\n\n\nFeatures\n--------\n\n* ActiveModel-style validation\n* Observe property value changes\n* Observe deletion and save\n* Abstract data store interface. So far:\n  * In-memory (built-in: `Tubbs.MemoryStore`)\n  * Riak (via tubbs-riakstorage - server-side only at the moment)\n  * REST (via rubbs-reststorage - browser-only, at the moment)\n\n\nExamples\n--------\n\n```js\nfunction User(data) {\n  this.setData(data);\n}\n\nTubbs(User, {\n  dataStore: new Memory(User),\n  basicProperties: ['username', 'first', 'last'],\n  validation: [\n    Validate.required(\"username\"),\n    Validate.lengthOf(\"username\", { min: 5 })\n  ],\n});\n\nObject.defineProperty(User, 'name', {\n  get: function() {\n    return ((this.first || '') + ' ' + (this.last || '')).trim();\n  },\n  enumerable: true\n});\n```\n\n\n**Create a new user**\n\n```js\nvar user = new User({\n  username: \"kbacon\",\n  first: \"Kevin\",\n  last: \"Bacon\"\n});\n```\n\n\n**Get one of its virtual properties**\n\n```js\nconsole.log(user.name);\n// -> 'Kevin Bacon'\n```\n\n\n**Observe property value changes**\n\n```js\nUser.on('change', function(instance, property, old, value) {\n  // When any property changes on any User instance\n});\n\nUser.on('change:name', function(instance, old, value) {\n  // When the \"name\" property changes on any User instance\n});\n\nvar user = new User();\n\nuser.on('change', function(property, old, value) {\n  // When any property changes on a specific User instance\n});\n\nuser.on('change:name', function(old, value) {\n  // When the \"name\" property changes on a specific User instance\n});\n```\n\n\n**Observe model creation and deletion and save**\n\n```js\nUser.on('save', function(instance) {\n  // When any User model is saved.\n});\n\nUser.on('delete', function(instance) {\n  // When any User model is deleted.\n});\n\nvar user = new User();\n\nuser.on('save', function(instance) {\n  // When a specific User model is saved.\n});\n\nuser.on('delete', function(instance) {\n  // When a specific User model is deleted.\n});\n```\n\n\n**Serialize the instance to pure JSON**\n\n```js\nconsole.log(JSON.stringify(user));\n// ->\n// {\n//   \"username\": \"kbacon\",\n//   \"first\": \"Kevin\",\n//   \"last\": \"Bacon\"\n// }\n```\n\n\nRoadmap (Also, see TODO.md)\n---------------------------\n\n* Validation\n  * `allowBlank` option?\n  * shortcut format validator strings, such as \"email\" and \"phone\"\n* Add a `beforeSave` option: beforeSave: function() { this.dateModified = new Date(); }\n* Figure out how to notify others when an error is thrown.\n* More unit test coverage\n* Schema-based generated class methods: Person.findAllByAge(50, cb)\n* Documentation Pages\n  * Model instance API\n  * Model class API\n  * Validators\n* CouchStore\n* MongoStore\n* RedisStore\n* LocalStorageStore\n","_id":"tubbs@0.1.3","dist":{"shasum":"ca895cf0c608480d0c34e209bb55e9a8454790ab","tarball":"https://registry.npmjs.org/tubbs/-/tubbs-0.1.3.tgz","integrity":"sha512-lm8CxRsqk2yssOe7i5CW3uNKp/QMtoAhhpXhH57s1olGe6EtgKUA0gmFMGP0IFbosWjSXzZkUcyI8GZQ++j4hA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAW0+7yrDcndXirelPF/JnKwCF5nHXAe1Jfi8IehCG3WAiAbhmjfkwEyMu4XC0AdHRWnTAkz4RakoYuJFNkCMJQzgg=="}]},"_npmVersion":"1.1.49","_npmUser":{"name":"dandean","email":"me@dandean.com"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]}},"maintainers":[{"name":"dandean","email":"me@dandean.com"}],"time":{"modified":"2022-06-27T23:06:53.281Z","created":"2011-07-20T19:07:47.550Z","0.0.1":"2011-07-20T19:07:48.000Z","0.0.2":"2011-07-21T05:51:10.263Z","0.0.3":"2011-08-20T03:22:51.717Z","0.0.4":"2012-01-03T03:01:26.949Z","0.0.6":"2012-09-04T23:31:04.147Z","0.0.7":"2012-09-11T21:28:35.755Z","0.0.8":"2012-09-12T21:38:39.689Z","0.0.9":"2012-09-14T20:43:35.326Z","0.1.1":"2012-10-25T23:27:03.741Z","0.1.2":"2012-10-26T23:34:27.723Z","0.1.3":"2012-10-31T07:20:50.234Z"},"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"repository":{"type":"git","url":"git://github.com/dandean/tubbs.git"}}