From 96d0609c64b8fe8c41e03eda89a768a3f3a71115 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Fri, 24 Sep 2021 14:19:27 -0700 Subject: [PATCH 1/2] first pass adding Table constructor and factory style instantiation --- index.js | 12 +++++++ package.json | 3 +- src/table.js | 76 ++++++++++++++++++++++++++++++++++++++++++++ test/factory-test.js | 37 +++++++++++++++++++++ 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/table.js create mode 100644 test/factory-test.js diff --git a/index.js b/index.js index b6afd96..2bf92bd 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,16 @@ let page = require('./src/page') let count = require('./src/count') let incr = require('./src/incr') let decr = require('./src/decr') +let Table = require('./src/table') + +/** + * instantiate many tables + * + * example + * + * let [cats, dogs] = factory('cats', 'dogs') + */ +let factory = (...args) => args.map(name => new Table(name)) module.exports = { get, @@ -14,4 +24,6 @@ module.exports = { count, incr, decr, + Table, + factory } diff --git a/package.json b/package.json index aeae515..f64b973 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "lint": "eslint --fix .", - "test": "npm run lint && tape test/*-test.js | tap-spec", + "test": "npm run lint && tape test/factory-test.js | tap-spec", + "_test": "npm run lint && tape test/*-test.js | tap-spec", "rc": "npm version prerelease --preid RC" }, "license": "Apache-2.0", diff --git a/src/table.js b/src/table.js new file mode 100644 index 0000000..cfb9b1c --- /dev/null +++ b/src/table.js @@ -0,0 +1,76 @@ +let _get = require('./get') +let _set = require('./set') +let _destroy = require('./destroy') +// let _page = require('./page') +// let _count = require('./count') +// let _incr = require('./incr') +// let _decr = require('./decr') + +/** + * instantiate a begin/data client scoped to a table + * example + * + * const cats = new Table('cats') + */ +module.exports = class Table { + + /** + * @param {string} name + */ + constructor (name) { + this.name = name + } + + async get (args) { + let params = addTable(args, this.name) + let result = await _get.call({}, params) + return removeTable(result) + } + + async set (args) { + let params = addTable(args, this.name) + let result = await _set.call({}, params) + return removeTable(result) + } + + async destroy (args) { + let params = addTable(args, this.name) + let result = await _destroy.call({}, params) + return removeTable(result) + } + // async page (args) {} + // async count (args) {} + // async incr (args) {} + // async decr (args) {} +} + +function addTable (args, name) { + let params + if (Array.isArray(args)) { + params = args.slice(0).map(function (param) { + params.table = name + return param + }) + } + else { + params = { ...args } + params.table = name + } + return params +} + +function removeTable (result) { + if (Array.isArray(result)) { + let returns = result.slice(0).map(function (r) { + delete r.table + return r + }) + if (result.cursor) + returns.cursor = result.cursor + return returns + } + else { + delete result.table + return result + } +} diff --git a/test/factory-test.js b/test/factory-test.js new file mode 100644 index 0000000..e14de85 --- /dev/null +++ b/test/factory-test.js @@ -0,0 +1,37 @@ +let sandbox = require('@architect/sandbox') +let { Table, factory } = require('../') +let test = require('tape') + +test('start sandbox', async t => { + t.plan(1) + await sandbox.start({ cwd: __dirname, quiet: true }) + t.pass('started') +}) + +test('classy style', async t => { + t.plan(4) + let cats = new Table('cats') + let sutr0 = await cats.set({ name: 'sutr0' }) + let again = await cats.get(sutr0) + t.ok(!!sutr0.key, 'has key') + t.ok(!!sutr0.table === false, 'but no table') + t.ok(again.key === sutr0.key, 'found sutr0') + t.ok(!!again.table === false, 'but no table') + console.log(sutr0, again) +}) + +test('factory style', async t => { + t.plan(2) + let [ cats, dogs ] = factory('cats', 'dogs') + let tuxedo = await cats.set({ name: 'tuxedo' }) + let yoda = await dogs.set({ name: 'yoda' }) + t.ok(!!tuxedo.key, 'tuxedo has key') + t.ok(!!yoda.key, 'yoda has key') + console.log(tuxedo, yoda) +}) + +test('end sandbox', async t => { + t.plan(1) + await sandbox.end() + t.pass('ended') +}) From 15d18e68682b19c7060801379af5491a467c7903 Mon Sep 17 00:00:00 2001 From: Brian LeRoux Date: Fri, 24 Sep 2021 15:13:52 -0700 Subject: [PATCH 2/2] factory polish --- index.js | 5 ++++- src/table.js | 36 ++++++++++++++++++++++++++++-------- test/factory-test.js | 17 +++++++++++++++++ 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 2bf92bd..d07d6bf 100644 --- a/index.js +++ b/index.js @@ -14,7 +14,10 @@ let Table = require('./src/table') * * let [cats, dogs] = factory('cats', 'dogs') */ -let factory = (...args) => args.map(name => new Table(name)) +function factory (...args) { + let result = args.map(name => new Table(name)) + return result.length === 1 ? result[0] : result +} module.exports = { get, diff --git a/src/table.js b/src/table.js index cfb9b1c..4c8e225 100644 --- a/src/table.js +++ b/src/table.js @@ -1,10 +1,10 @@ let _get = require('./get') let _set = require('./set') let _destroy = require('./destroy') -// let _page = require('./page') -// let _count = require('./count') -// let _incr = require('./incr') -// let _decr = require('./decr') +let _page = require('./page') +let _count = require('./count') +let _incr = require('./incr') +let _decr = require('./decr') /** * instantiate a begin/data client scoped to a table @@ -38,10 +38,30 @@ module.exports = class Table { let result = await _destroy.call({}, params) return removeTable(result) } - // async page (args) {} - // async count (args) {} - // async incr (args) {} - // async decr (args) {} + + async page (args) { + let params = addTable(args, this.name) + let result = await _page.call({}, params) + return removeTable(result) + } + + async count (args) { + let params = addTable(args, this.name) + let result = await _count.call({}, params) + return removeTable(result) + } + + async incr (args) { + let params = addTable(args, this.name) + let result = await _incr.call({}, params) + return removeTable(result) + } + + async decr (args) { + let params = addTable(args, this.name) + let result = await _decr.call({}, params) + return removeTable(result) + } } function addTable (args, name) { diff --git a/test/factory-test.js b/test/factory-test.js index e14de85..6129073 100644 --- a/test/factory-test.js +++ b/test/factory-test.js @@ -30,6 +30,23 @@ test('factory style', async t => { console.log(tuxedo, yoda) }) +test('page', async t => { + t.plan(1) + let cats = factory('cats') + let pages = await cats.page({ limit: 1 }) + let count = 0 + for await (let c of pages) + count += c.length + t.ok(count === 2, 'found two cats') +}) + +test('count', async t => { + t.plan(1) + let cats = factory('cats') + let len = await cats.count() + t.ok(len === 2, 'found two cats') +}) + test('end sandbox', async t => { t.plan(1) await sandbox.end()