From 04ef632e15d07b1cf4bb4d489328d8167952e5fc Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Tue, 12 Sep 2017 19:00:11 -0700 Subject: [PATCH] Create shortcut in Mixin for findOne and findAll. (#8) --- CHANGELOG.md | 4 +++ package-lock.json | 64 ++++++++++++++++++++++----------------------- package.json | 6 ++--- src/Mixin.js | 49 ++++++++++++++++++++++++++++++++++ tests/Mixin.test.js | 34 ++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f54f59..9ad45a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # CHANGELOG +## v0.2.1 +* issue #7: Create shortcut in Mixin for findOne and findAll. + + ## v0.2.0 * issue #3: Create DynamoDb item marshaler for converting pbj to and from DynamoDb json format. diff --git a/package-lock.json b/package-lock.json index 9b7252e..ef3f571 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1043,9 +1043,9 @@ "dev": true }, "bignumber.js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.2.tgz", - "integrity": "sha1-LR3DfuWWiGfs6pC22k0W5oYI0h0=" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz", + "integrity": "sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==" }, "binary-extensions": { "version": "1.10.0", @@ -1325,7 +1325,7 @@ "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" + "rimraf": "2.6.2" } }, "detect-indent": { @@ -1568,13 +1568,13 @@ "integrity": "sha1-NV0pAEC7+OAL+LSxn0twy+fCMX8=", "dev": true, "requires": { - "eslint-config-airbnb-base": "11.3.1" + "eslint-config-airbnb-base": "11.3.2" } }, "eslint-config-airbnb-base": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.1.tgz", - "integrity": "sha512-BXVH7PV5yiLjnkv49iOLJ8dWp+ljZf310ytQpqwrunFADiEbWRyN0tPGDU36FgEbdLvhJDWcJOngYDzPF4shDw==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", + "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", "dev": true, "requires": { "eslint-restricted-globals": "0.1.1" @@ -2369,8 +2369,7 @@ "jsbn": { "version": "0.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "json-schema": { "version": "0.2.3", @@ -2702,14 +2701,6 @@ } } }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, "string-width": { "version": "1.0.2", "bundled": true, @@ -2720,6 +2711,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, "stringstream": { "version": "0.0.5", "bundled": true, @@ -2787,8 +2786,7 @@ "tweetnacl": { "version": "0.14.5", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "uid-number": { "version": "0.0.6", @@ -3425,7 +3423,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -4022,9 +4020,9 @@ } }, "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" @@ -4159,15 +4157,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4190,6 +4179,15 @@ "function-bind": "1.1.0" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/package.json b/package.json index d59f879..04a4967 100755 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "jsnext:main": "./index.js", "dependencies": { "base-64": "^0.1.0", - "bignumber.js": "^4.0.2" + "bignumber.js": "^4.0.4" }, "peerDependencies": { "@gdbots/common": "^0.1.0", @@ -42,7 +42,7 @@ "elasticsearch": "^13.0.1", "eslint": "^3.19.0", "eslint-config-airbnb": "^14.1.0", - "eslint-config-airbnb-base": "^11.1.3", + "eslint-config-airbnb-base": "^11.3.2", "eslint-plugin-import": "^2.2.0", "eslint-plugin-jsx-a11y": "^4.0.0", "eslint-plugin-react": "^6.9.0", @@ -51,7 +51,7 @@ "lodash-es": "^4.17.4", "md5": "^2.2.1", "moment": "^2.18.1", - "rimraf": "^2.6.1", + "rimraf": "^2.6.2", "tape": "^4.6.3", "utf8": "^2.1.2", "uuid": "^3.1.0" diff --git a/src/Mixin.js b/src/Mixin.js index a3705fc..eb07101 100644 --- a/src/Mixin.js +++ b/src/Mixin.js @@ -1,5 +1,6 @@ /* eslint-disable class-methods-use-this */ import LogicException from './exceptions/LogicException'; +import MessageResolver from './MessageResolver'; /** * We store all Mixin instances to accomplish a loose flyweight strategy. @@ -26,6 +27,54 @@ export default class Mixin { return instances.get(this); } + /** + * Shortcut to resolving a mixin to one concrete schema. + * + * @param {?string} inPackage + * @param {?string} inCategory + * + * @returns {Schema} + */ + static findOne(inPackage = null, inCategory = null) { + return MessageResolver.findOneUsingMixin(this.create(), inPackage, inCategory); + } + + /** + * Shortcut to resolving a mixin to one concrete schema. + * + * @param {?string} inPackage + * @param {?string} inCategory + * + * @returns {Schema} + */ + findOne(inPackage = null, inCategory = null) { + return MessageResolver.findOneUsingMixin(this, inPackage, inCategory); + } + + /** + * Shortcut to resolving a mixin to all concrete schemas. + * + * @param {?string} inPackage + * @param {?string} inCategory + * + * @returns {Schema[]} + */ + static findAll(inPackage = null, inCategory = null) { + return MessageResolver.findAllUsingMixin(this.create(), inPackage, inCategory); + } + + /** + * Shortcut to resolving a mixin to all concrete schemas. + * + * @param {?string} inPackage + * @param {?string} inCategory + * + * @returns {Schema[]} + */ + findAll(inPackage = null, inCategory = null) { + return MessageResolver.findAllUsingMixin(this, inPackage, inCategory); + } + /** * @returns {SchemaId} */ diff --git a/tests/Mixin.test.js b/tests/Mixin.test.js index adb211f..30c89ff 100644 --- a/tests/Mixin.test.js +++ b/tests/Mixin.test.js @@ -2,6 +2,8 @@ import test from 'tape'; import Mixin from '../src/Mixin'; import SchemaId from '../src/SchemaId'; import SampleMixinV1 from './fixtures/SampleMixinV1'; +import SampleMixinV2 from './fixtures/SampleMixinV2'; +import SampleUnusedMixinV1 from './fixtures/SampleUnusedMixinV1'; test('Mixin tests', (t) => { const mixin = SampleMixinV1.create(); @@ -21,3 +23,35 @@ test('Mixin tests', (t) => { t.end(); }); + + +test('Mixin findOne/findAll tests', (t) => { + const mixin1 = SampleMixinV1.create(); + const mixin2 = SampleMixinV2.create(); + const unusedMixin = SampleUnusedMixinV1.create(); + + t.same(SampleMixinV1.findAll().length, 2); + t.same(mixin1.findAll().length, 2); + + t.same(SampleMixinV2.findOne().getCurie().toString(), 'gdbots:pbj.tests::sample-message'); + t.same(mixin2.findOne().getCurie().toString(), 'gdbots:pbj.tests::sample-message'); + + try { + mixin1.findOne(); + t.fail('mixin findOne should not pass when has multiple consumers'); + } catch (e) { + t.pass('mixin findOne failed since it has multiple consumers'); + } + + try { + SampleUnusedMixinV1.findAll(); + unusedMixin.findAll(); + SampleUnusedMixinV1.findOne(); + unusedMixin.findOne(); + t.fail('unusedMixin findOne/findAll should not pass when has no consumers'); + } catch (e) { + t.pass('mixin findOne/findAll failed since it has no consumers'); + } + + t.end(); +});