From 3e5c01d060b82118be01e9e791d6338569698aa2 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Mon, 7 Aug 2023 18:31:35 +0200 Subject: [PATCH 1/4] feat: Add Bool scalar --- package-lock.json | 6 +++++ package.json | 1 + src/scalar/bool.test.ts | 31 +++++++++++++++++++++++ src/scalar/bool.ts | 54 +++++++++++++++++++++++++++++++++++++++++ src/scalar/util.ts | 3 +++ 5 files changed, 95 insertions(+) create mode 100644 src/scalar/bool.test.ts create mode 100644 src/scalar/bool.ts create mode 100644 src/scalar/util.ts diff --git a/package-lock.json b/package-lock.json index 59fac6d..7dd7cb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@apache-arrow/esnext-esm": "^12.0.1", "@cloudquery/plugin-pb-javascript": "^0.0.6", + "boolean": "^3.2.0", "yargs": "^17.7.2" }, "devDependencies": { @@ -975,6 +976,11 @@ "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", diff --git a/package.json b/package.json index 2820fbc..475de15 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "dependencies": { "@apache-arrow/esnext-esm": "^12.0.1", "@cloudquery/plugin-pb-javascript": "^0.0.6", + "boolean": "^3.2.0", "yargs": "^17.7.2" } } diff --git a/src/scalar/bool.test.ts b/src/scalar/bool.test.ts new file mode 100644 index 0000000..4ef13ad --- /dev/null +++ b/src/scalar/bool.test.ts @@ -0,0 +1,31 @@ +import test from 'ava'; +import { DataType } from '@apache-arrow/esnext-esm'; +import { Bool } from './bool.js'; + +[null, undefined].forEach((v) => { + test(`should set values to false when ${v} is passed`, (t) => { + const b = new Bool(v); + t.is(b.Valid, false); + t.true(DataType.isBool(b.DataType)); + }); +}); + +[1, true, 'true', 'Y', 'y', 'TRUE', 'on'].forEach((v, i) => { + test(`should support truthy value '${v}' (${i})`, (t) => { + const b = new Bool(v); + t.is(b.Valid, true); + t.is(b.Value, true); + t.true(DataType.isBool(b.DataType)); + t.is(b.toString(), 'true'); + }); +}); + +[0, false, 'false', 'N', 'n', 'FALSE', 'off'].forEach((v, i) => { + test(`should support falsy value '${v}' (${i})`, (t) => { + const b = new Bool(v); + t.is(b.Valid, true); + t.is(b.Value, false); + t.true(DataType.isBool(b.DataType)); + t.is(b.toString(), 'false'); + }); +}); diff --git a/src/scalar/bool.ts b/src/scalar/bool.ts new file mode 100644 index 0000000..1767f28 --- /dev/null +++ b/src/scalar/bool.ts @@ -0,0 +1,54 @@ +import { Bool as ArrowBool } from '@apache-arrow/esnext-esm'; +import { boolean, isBooleanable } from 'boolean'; +import { isInvalid, NULL_VALUE } from './util.js'; + +export class Bool { + private _valid = false; + private _value = false; + + public constructor(v: unknown) { + this.Valid = v; + return this; + } + + public get DataType() { + return new ArrowBool(); + } + + public get Valid() { + return this._valid; + } + + public get Value() { + return this._value; + } + + public set Valid(value: unknown) { + if (isInvalid(value)) { + this._valid = false; + return; + } + + let val = value; + // Check if this might be a scalar boolean + if (Object.hasOwnProperty.call(value, 'value')) { + val = (value as { value: unknown }).value; + } + + if (isBooleanable(value)) { + this._value = boolean(value); + this._valid = true; + return; + } + + throw new Error(`Unable to set '${value}' as Bool`); + } + + public toString() { + if (this._valid) { + return String(this._value); + } + + return NULL_VALUE; + } +} diff --git a/src/scalar/util.ts b/src/scalar/util.ts new file mode 100644 index 0000000..12b7522 --- /dev/null +++ b/src/scalar/util.ts @@ -0,0 +1,3 @@ +export const NULL_VALUE = '(null)'; + +export const isInvalid = (value: unknown) => value === null || value === undefined; From 2e22b31b08f39630727326843f25b1285cd5dee0 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Mon, 7 Aug 2023 18:33:05 +0200 Subject: [PATCH 2/4] test: Add throws test --- src/scalar/bool.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/scalar/bool.test.ts b/src/scalar/bool.test.ts index 4ef13ad..a2f4ba5 100644 --- a/src/scalar/bool.test.ts +++ b/src/scalar/bool.test.ts @@ -29,3 +29,7 @@ import { Bool } from './bool.js'; t.is(b.toString(), 'false'); }); }); + +test('should throw when unable to set value', (t) => { + t.throws(() => new Bool({ value: {} }), { message: "Unable to set '[object Object]' as Bool" }); +}); From 9182ef9eb1ed4c4fb543fc8ac6314785ad7499d7 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Mon, 7 Aug 2023 19:41:19 +0200 Subject: [PATCH 3/4] fix: Self set --- src/scalar/bool.test.ts | 4 ++-- src/scalar/bool.ts | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/scalar/bool.test.ts b/src/scalar/bool.test.ts index a2f4ba5..48047b4 100644 --- a/src/scalar/bool.test.ts +++ b/src/scalar/bool.test.ts @@ -10,7 +10,7 @@ import { Bool } from './bool.js'; }); }); -[1, true, 'true', 'Y', 'y', 'TRUE', 'on'].forEach((v, i) => { +[1, true, 'true', 'Y', 'y', 'TRUE', 'on', new Bool(true)].forEach((v, i) => { test(`should support truthy value '${v}' (${i})`, (t) => { const b = new Bool(v); t.is(b.Valid, true); @@ -20,7 +20,7 @@ import { Bool } from './bool.js'; }); }); -[0, false, 'false', 'N', 'n', 'FALSE', 'off'].forEach((v, i) => { +[0, false, 'false', 'N', 'n', 'FALSE', 'off', new Bool(false)].forEach((v, i) => { test(`should support falsy value '${v}' (${i})`, (t) => { const b = new Bool(v); t.is(b.Valid, true); diff --git a/src/scalar/bool.ts b/src/scalar/bool.ts index 1767f28..d33dfa6 100644 --- a/src/scalar/bool.ts +++ b/src/scalar/bool.ts @@ -15,11 +15,11 @@ export class Bool { return new ArrowBool(); } - public get Valid() { + public get Valid(): boolean { return this._valid; } - public get Value() { + public get Value(): boolean { return this._value; } @@ -29,10 +29,11 @@ export class Bool { return; } - let val = value; // Check if this might be a scalar boolean - if (Object.hasOwnProperty.call(value, 'value')) { - val = (value as { value: unknown }).value; + if (value instanceof Bool) { + this._valid = value.Valid; + this._value = value.Value; + return; } if (isBooleanable(value)) { From 4aadfd0f9abb35ce9412e811a5779e6f0af5d4b8 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Mon, 7 Aug 2023 19:42:17 +0200 Subject: [PATCH 4/4] refactor: Remove comment --- src/scalar/bool.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scalar/bool.ts b/src/scalar/bool.ts index d33dfa6..e33972a 100644 --- a/src/scalar/bool.ts +++ b/src/scalar/bool.ts @@ -29,7 +29,6 @@ export class Bool { return; } - // Check if this might be a scalar boolean if (value instanceof Bool) { this._valid = value.Valid; this._value = value.Value;