From 4662fc41718743f49724b689b3779cb20c96dd18 Mon Sep 17 00:00:00 2001 From: ada mandala Date: Mon, 12 Feb 2024 14:41:01 -0600 Subject: [PATCH] update migrations --- .../src/ts/column_config.ts | 1 + rust/perspective-viewer/src/ts/migrate.ts | 41 ++++---- .../src/ts/migrate/0-0-0.ts | 8 +- .../src/ts/migrate/2-6-1.ts | 38 ++++---- .../src/ts/migrate/2-7-1.ts | 94 ++++++++++++++++--- .../src/ts/migrate/semver.ts | 4 + 6 files changed, 135 insertions(+), 51 deletions(-) diff --git a/rust/perspective-viewer/src/ts/column_config.ts b/rust/perspective-viewer/src/ts/column_config.ts index eed4da7f60..83eca56099 100644 --- a/rust/perspective-viewer/src/ts/column_config.ts +++ b/rust/perspective-viewer/src/ts/column_config.ts @@ -38,6 +38,7 @@ export type PerspectiveColumnConfigValue = { datagrid_datetime_style?: { timeZone?: string; datetime_color_mode?: "foreground" | "background"; + color?: string; } & ( | { format?: "custom"; diff --git a/rust/perspective-viewer/src/ts/migrate.ts b/rust/perspective-viewer/src/ts/migrate.ts index 19c40041c6..5f443fe332 100644 --- a/rust/perspective-viewer/src/ts/migrate.ts +++ b/rust/perspective-viewer/src/ts/migrate.ts @@ -62,7 +62,7 @@ const PKG_VERSION = packageJSON.version; * script's package. */ export function convert( - old: Record | ArrayBuffer | string, + old: InitialConfig | ArrayBuffer | string, { warn = true, verbose = false, @@ -71,33 +71,39 @@ export function convert( ): PerspectiveViewerConfig | ArrayBuffer | string { if (typeof old === "object" && !(old instanceof ArrayBuffer)) { const copy = JSON.parse(JSON.stringify(old)); + let options = { + warn: verbose ? true : warn, + verbose, + replace_defaults, + }; if ("viewers" in copy && "detail" in copy) { - return migrate_workspace(copy, { warn, replace_defaults }); + return migrate_workspace(copy, options); } else { - return migrate_viewer(copy, false, { - warn: verbose ? true : warn, - verbose, - replace_defaults, - }); + return migrate_viewer(copy, false, options); } } else { return old; } } +type InitialConfig = Record; + export type PerspectiveConvertOptions = { warn?: boolean; verbose?: boolean; replace_defaults?: boolean; + omit_attributes?: boolean; }; +export type Options = PerspectiveConvertOptions & { version_chain?: string[] }; + /** * Migrate a layout for `` - * @param old + * @param old - TODO this should get a WorkspaceConfig type * @param options * @returns */ -function migrate_workspace(old, options) { +function migrate_workspace(old: any, options: Options) { for (const key in old.viewers) { old.viewers[key] = migrate_viewer(old.viewers[key], true, options); if (!("master" in old.viewers[key])) { @@ -128,7 +134,7 @@ function migrate_workspace(old, options) { * @param options * @returns */ -function migrate_viewer(old, omit_attributes, options) { +function migrate_viewer(old: any, omit_attributes: boolean, options: Options) { old.version = old.version ? new Semver(old.version) : new Semver("0.0.0"); options.omit_attributes = omit_attributes; // This array details the "next version" in line. It begins with 2.6.1 @@ -147,7 +153,12 @@ function migrate_viewer(old, omit_attributes, options) { migrate_2_6_1, migrate_2_7_1, assure_latest, - semver_to_string, + (old) => { + return { + ...old, + version: old.version.to_string(), + }; + }, ], options ); @@ -166,12 +177,6 @@ function assure_latest(old: { version: Semver }) { } } -function semver_to_string(old) { - // intentionally ignores build - old.version = `${old.version.major}.${old.version.minor}.${old.version.patch}`; - return old; -} - /** * Chains functions of `args` and apply to `old` * @param old @@ -179,7 +184,7 @@ function semver_to_string(old) { * @param options * @returns */ -export function chain(old, args, options) { +export function chain(old: object, args: Function[], options: Options) { for (const arg of args) { old = arg(old, options); } diff --git a/rust/perspective-viewer/src/ts/migrate/0-0-0.ts b/rust/perspective-viewer/src/ts/migrate/0-0-0.ts index 4db4c056bf..51f4457818 100644 --- a/rust/perspective-viewer/src/ts/migrate/0-0-0.ts +++ b/rust/perspective-viewer/src/ts/migrate/0-0-0.ts @@ -10,7 +10,7 @@ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ -import { chain } from "../migrate"; +import { Options, chain } from "../migrate"; import Semver from "./semver"; /** @@ -20,7 +20,7 @@ import Semver from "./semver"; * @param options * @returns The migrated viewer. */ -export default function migrate_0_0_0(old, options) { +export default function migrate_0_0_0(old: any, options: Options) { const next_version = options.version_chain.shift(); if (old.version?.gt(next_version)) { return old; @@ -36,7 +36,7 @@ export default function migrate_0_0_0(old, options) { migrate_split_by, migrate_filters, migrate_expressions, - options.replace_defaults ? migrate_nulls : false, + options.replace_defaults ? migrate_nulls : (x) => x, migrate_plugins, migrate_plugin_config, migrate_title, @@ -48,7 +48,7 @@ export default function migrate_0_0_0(old, options) { old.version = new Semver("0.0.0"); return old; }, - ].filter((x) => !!x), + ], options ); diff --git a/rust/perspective-viewer/src/ts/migrate/2-6-1.ts b/rust/perspective-viewer/src/ts/migrate/2-6-1.ts index b61ccfe2c4..32cf2a1593 100644 --- a/rust/perspective-viewer/src/ts/migrate/2-6-1.ts +++ b/rust/perspective-viewer/src/ts/migrate/2-6-1.ts @@ -12,6 +12,7 @@ import { ViewConfig } from "@finos/perspective"; import Semver from "./semver"; +import { Options } from "../migrate"; /** * Migrates from 2.6.1 @@ -19,7 +20,7 @@ import Semver from "./semver"; * @param options * @returns */ -export default function migrate_2_6_1(old, options) { +export default function migrate_2_6_1(old: any, options: Options) { let next_version = options.version_chain.shift(); if (old.version?.gt(next_version)) { return old; @@ -56,26 +57,27 @@ export default function migrate_2_6_1(old, options) { } // check for string expressions, replace with objects - let new_exprs = {}; - for (let i in old.expressions) { - if (typeof old.expressions[i] === "string") { - if (options.warn) { - console.warn( - "Replacing deprecated string expression with object" - ); - } - let old_expr = old.expressions[i]; - let [whole_expr, name, expr] = old_expr.match( - /\/\/\s*([^\n]+)\n(.*)/ - ) ?? [old_expr, null, null]; - if (name && expr) { - new_exprs[name] = expr; - } else { - new_exprs[whole_expr] = whole_expr; + if (Array.isArray(old.expressions)) { + let new_exprs = {}; + for (let old_expr of old.expressions) { + if (typeof old_expr === "string") { + if (options.warn) { + console.warn( + "Replacing deprecated string expression with object" + ); + } + let [whole_expr, name, expr] = old_expr.match( + /\/\/\s*([^\n]+)\n(.*)/ + ) ?? [old_expr, null, null]; + if (name && expr) { + new_exprs[name] = expr; + } else { + new_exprs[whole_expr] = whole_expr; + } } } + old.expressions = new_exprs; } - old.expressions = new_exprs; if (options.verbose) { console.log(old); diff --git a/rust/perspective-viewer/src/ts/migrate/2-7-1.ts b/rust/perspective-viewer/src/ts/migrate/2-7-1.ts index 20bcfd359c..b65bc0f1a9 100644 --- a/rust/perspective-viewer/src/ts/migrate/2-7-1.ts +++ b/rust/perspective-viewer/src/ts/migrate/2-7-1.ts @@ -11,21 +11,24 @@ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ import Semver from "./semver"; -import { PerspectiveConvertOptions } from "../migrate"; +import { Options } from "../migrate"; import { Config261 } from "./2-6-1"; -import { ColumnConfig } from "../viewer"; +import { + PerspectiveColumnConfig, + PerspectiveColumnConfigValue, +} from "../perspective-viewer"; /** - * Migrates from 2.6.1 + * Migrates from 2.7.1. Focus is on plugin API changes, moving plugin_config.columns to column_config * @param old * @param options * @returns */ export default function migrate_2_7_1( old: Config261 & { - column_config?: ColumnConfig; + column_config?: PerspectiveColumnConfig; }, - options: PerspectiveConvertOptions & { version_chain: string[] } + options: Options ) { let next_version = options.version_chain.shift(); if (old.version?.gt(next_version!)) { @@ -35,10 +38,12 @@ export default function migrate_2_7_1( } old.version = new Semver(next_version!); + old.column_config = old.column_config ?? {}; + const has_config = !!old.plugin_config?.columns; const has_plugin = old.plugin === "Datagrid" || old.plugin === "X/Y Scatter"; - if (has_config || has_plugin) { + if (has_config && has_plugin) { if (options.warn) { console.warn("Migrating plugin_config to column_config!"); } @@ -49,7 +54,7 @@ export default function migrate_2_7_1( old.column_config[column_name] ?? {}; if (old.plugin === "X/Y Scatter") { - old.column_config[column_name].Symbols = + old.column_config[column_name].symbols = old.plugin_config.columns[column_name]?.symbols ?? {}; delete old.plugin_config.columns[column_name]; } else { @@ -59,9 +64,73 @@ export default function migrate_2_7_1( delete old.plugin_config.columns[column_name] .column_width_override; for (const [key, val] of Object.entries(value_map)) { - old.column_config[column_name].styles = - old.column_config[column_name].styles ?? {}; - old.column_config[column_name].styles[key] = val; + let control: keyof PerspectiveColumnConfigValue; + switch (key) { + case "number_fg_mode": + case "number_bg_mode": + case "fixed": + case "pos_fg_color": + case "neg_fg_color": + case "pos_bg_color": + case "neg_bg_color": + case "fg_gradient": + case "bg_gradient": { + control = "datagrid_number_style"; + break; + } + case "timeZone": + case "datetime_color_mode": + case "fractionalSecondDigits": + case "second": + case "minute": + case "hour": + case "day": + case "weekday": + case "month": + case "year": + case "hour12": + case "dateStyle": + case "timeStyle": { + control = "datagrid_datetime_style"; + break; + } + case "string_color_mode": { + control = "datagrid_string_style"; + break; + } + case "format": { + if (val === "custom") { + control = "datagrid_datetime_style"; + } else { + control = "datagrid_string_style"; + } + break; + } + case "color": { + if ( + //@ts-ignore + value_map.datetime_color_mode || + old.column_config[column_name] + ?.datagrid_datetime_style + ?.datetime_color_mode + ) { + control = "datagrid_datetime_style"; + } else if ( + //@ts-ignore + value_map.string_color_mode || + old.column_config[column_name] + ?.datagrid_string_style?.string_color_mode + ) { + control = "datagrid_string_style"; + } + break; + } + } + + // @ts-ignore this is confused by union of struct types with symbols as Record + old.column_config[column_name][control] = + old.column_config[column_name][control] ?? {}; + old.column_config[column_name][control][key] = val; delete old.plugin_config.columns[column_name][key]; } if (!!cwo) { @@ -73,7 +142,10 @@ export default function migrate_2_7_1( } } } - if (Object.keys(old.plugin_config?.columns).length === 0) { + if ( + old.plugin === "X/Y Scatter" && + Object.keys(old.plugin_config?.columns).length === 0 + ) { delete old.plugin_config?.columns; } } diff --git a/rust/perspective-viewer/src/ts/migrate/semver.ts b/rust/perspective-viewer/src/ts/migrate/semver.ts index 8f7116855f..c9688a9c4e 100644 --- a/rust/perspective-viewer/src/ts/migrate/semver.ts +++ b/rust/perspective-viewer/src/ts/migrate/semver.ts @@ -52,6 +52,10 @@ export default class Semver { return this; } + to_string() { + return `${this.major}.${this.minor}.${this.patch}`; + } + gt(val: string | Semver) { let right = new Semver(val); return (