()) {
(Fg, Ok(x)) => {
self.fg_gradient = Some(x);
self.config.fg_gradient = Some(x);
- }
+ },
(Fg, Err(_)) if gradient.is_empty() => {
self.fg_gradient = Some(self.default_config.fg_gradient);
self.config.fg_gradient = Some(self.default_config.fg_gradient);
- }
+ },
(Fg, Err(_)) => {
self.fg_gradient = Some(self.default_config.fg_gradient);
self.config.fg_gradient = None;
- }
+ },
(Bg, Ok(x)) => {
self.bg_gradient = Some(x);
self.config.bg_gradient = Some(x);
- }
+ },
(Bg, Err(_)) if gradient.is_empty() => {
self.bg_gradient = Some(self.default_config.bg_gradient);
self.config.bg_gradient = Some(self.default_config.bg_gradient);
- }
+ },
(Bg, Err(_)) => {
self.bg_gradient = Some(self.default_config.bg_gradient);
self.config.bg_gradient = None;
- }
+ },
};
self.dispatch_config(ctx);
false
- }
+ },
NumberColumnStyleMsg::DefaultGradientChanged(gradient) => {
self.fg_gradient.get_or_insert(gradient);
self.bg_gradient.get_or_insert(gradient);
self.default_config.fg_gradient = gradient;
self.default_config.bg_gradient = gradient;
true
- }
+ },
}
}
@@ -494,8 +494,8 @@ impl NumberColumnStyle {
{
config.pos_fg_color = None;
config.neg_fg_color = None;
- }
- _ => {}
+ },
+ _ => {},
};
match &self.config {
@@ -508,8 +508,8 @@ impl NumberColumnStyle {
{
config.pos_bg_color = None;
config.neg_bg_color = None;
- }
- _ => {}
+ },
+ _ => {},
};
ctx.props().on_change.emit(config);
@@ -563,7 +563,7 @@ impl NumberColumnStyle {
None if self.default_config.fixed > 0 => {
let n = self.default_config.fixed as usize - 1;
format!("0.{}1", "0".repeat(n))
- }
+ },
Some(_) | None => "1".to_owned(),
};
@@ -608,7 +608,7 @@ impl NumberColumnStyle {
config.pos_fg_color = Some(pos_fg_color.to_owned());
config.neg_fg_color = Some(neg_fg_color.to_owned());
x
- }
+ },
};
let bg_mode = match config.number_bg_mode {
@@ -617,7 +617,7 @@ impl NumberColumnStyle {
config.pos_bg_color = Some(pos_bg_color.to_owned());
config.neg_bg_color = Some(neg_bg_color.to_owned());
x
- }
+ },
};
Self {
diff --git a/rust/perspective-viewer/src/rust/components/plugin_selector.rs b/rust/perspective-viewer/src/rust/components/plugin_selector.rs
index 7ff332cb56..ee26a6ada0 100644
--- a/rust/perspective-viewer/src/rust/components/plugin_selector.rs
+++ b/rust/perspective-viewer/src/rust/components/plugin_selector.rs
@@ -88,11 +88,11 @@ impl Component for PluginSelector {
ApiFuture::spawn(ctx.props().update_and_render(update));
self.is_open = false;
false
- }
+ },
OpenMenu => {
self.is_open = !self.is_open;
true
- }
+ },
}
}
@@ -162,7 +162,7 @@ fn PluginSelect(props: &PluginSelectProps) -> Html {
html! {
diff --git a/rust/perspective-viewer/src/rust/components/render_warning.rs b/rust/perspective-viewer/src/rust/components/render_warning.rs
index c9b697833d..bce43c234e 100644
--- a/rust/perspective-viewer/src/rust/components/render_warning.rs
+++ b/rust/perspective-viewer/src/rust/components/render_warning.rs
@@ -85,7 +85,7 @@ impl Component for RenderWarning {
renderer.disable_active_plugin_render_warning();
renderer.update(&session).await
});
- }
+ },
};
true
}
diff --git a/rust/perspective-viewer/src/rust/components/status_bar.rs b/rust/perspective-viewer/src/rust/components/status_bar.rs
index 48b1b4f82b..b6645e6ed2 100644
--- a/rust/perspective-viewer/src/rust/components/status_bar.rs
+++ b/rust/perspective-viewer/src/rust/components/status_bar.rs
@@ -125,19 +125,19 @@ impl Component for StatusBar {
StatusBarMsg::SetIsUpdating(is_updating) => {
self.is_updating = max!(0, self.is_updating + if is_updating { 1 } else { -1 });
true
- }
+ },
StatusBarMsg::TableStatsChanged => true,
StatusBarMsg::Reset(all) => {
ctx.props().on_reset.emit(all);
false
- }
+ },
StatusBarMsg::SetThemeConfig((themes, index)) => {
let new_theme = index.and_then(|x| themes.get(x)).cloned();
let should_render = new_theme != self.theme || self.themes != themes;
self.theme = new_theme;
self.themes = themes;
should_render
- }
+ },
StatusBarMsg::SetTheme(theme_name) => {
clone!(
ctx.props().renderer,
@@ -151,25 +151,25 @@ impl Component for StatusBar {
});
false
- }
+ },
StatusBarMsg::Export => {
let target = self.export_ref.cast::().unwrap();
self.export_dropdown
.get_or_insert_with(|| ExportDropDownMenuElement::new_from_model(ctx.props()))
.open(target);
false
- }
+ },
StatusBarMsg::Copy => {
let target = self.copy_ref.cast::().unwrap();
self.copy_dropdown
.get_or_insert_with(|| CopyDropDownMenuElement::new_from_model(ctx.props()))
.open(target);
false
- }
+ },
StatusBarMsg::SetTitle(title) => {
ctx.props().presentation.set_title(title);
false
- }
+ },
}
}
@@ -215,7 +215,7 @@ impl Component for StatusBar {
}
}
- }
+ },
};
let oninput = ctx.link().callback({
diff --git a/rust/perspective-viewer/src/rust/components/status_bar_counter.rs b/rust/perspective-viewer/src/rust/components/status_bar_counter.rs
index bb78704e17..d70f12b82a 100644
--- a/rust/perspective-viewer/src/rust/components/status_bar_counter.rs
+++ b/rust/perspective-viewer/src/rust/components/status_bar_counter.rs
@@ -73,7 +73,7 @@ impl Component for StatusBarRowsCounter {
html_template! {
{ format!("{} ({}) x {} ({})", vrows, nrows, vcols, ncols) }
}
- }
+ },
Some(
ViewStats {
@@ -95,7 +95,7 @@ impl Component for StatusBarRowsCounter {
html_template! {
{ format!("{} ({}) x {}", vrows, nrows, vcols) }
}
- }
+ },
Some(ViewStats {
num_table_cells: Some((_, tc)),
@@ -108,7 +108,7 @@ impl Component for StatusBarRowsCounter {
html_template! {
{ format!("{} x {} ({})", vrows, vcols, ncols) }
}
- }
+ },
Some(ViewStats {
num_table_cells: Some((tr, tc)),
@@ -121,7 +121,7 @@ impl Component for StatusBarRowsCounter {
{ format!("{} x {}", nrows, ncols) }
}
- }
+ },
Some(ViewStats {
num_table_cells: None,
..
diff --git a/rust/perspective-viewer/src/rust/components/string_column_style.rs b/rust/perspective-viewer/src/rust/components/string_column_style.rs
index 80063a4c50..09f38aafbd 100644
--- a/rust/perspective-viewer/src/rust/components/string_column_style.rs
+++ b/rust/perspective-viewer/src/rust/components/string_column_style.rs
@@ -91,12 +91,12 @@ impl StringColumnStyle {
}
- }
+ },
_ => {
html! {
{ title }
}
- }
+ },
}
}
}
@@ -129,7 +129,7 @@ impl Component for StringColumnStyle {
StringColumnStyleMsg::Reset(config) => {
self.config = config;
true
- }
+ },
StringColumnStyleMsg::FormatEnabled(val) => {
self.config.format = if val {
Some(FormatMode::default())
@@ -139,12 +139,12 @@ impl Component for StringColumnStyle {
self.dispatch_config(ctx);
true
- }
+ },
StringColumnStyleMsg::FormatChanged(val) => {
self.config.format = Some(val);
self.dispatch_config(ctx);
true
- }
+ },
StringColumnStyleMsg::ColorModeEnabled(enabled) => {
if enabled {
self.config.string_color_mode = Some(StringColorMode::default());
@@ -155,17 +155,17 @@ impl Component for StringColumnStyle {
self.dispatch_config(ctx);
true
- }
+ },
StringColumnStyleMsg::ColorModeChanged(mode) => {
self.config.string_color_mode = Some(mode);
self.dispatch_config(ctx);
true
- }
+ },
StringColumnStyleMsg::ColorChanged(color) => {
self.config.color = Some(color);
self.dispatch_config(ctx);
true
- }
+ },
}
}
diff --git a/rust/perspective-viewer/src/rust/components/tests/column_style.rs b/rust/perspective-viewer/src/rust/components/tests/column_style.rs
index a65e9a6440..5cb0651d5d 100644
--- a/rust/perspective-viewer/src/rust/components/tests/column_style.rs
+++ b/rust/perspective-viewer/src/rust/components/tests/column_style.rs
@@ -71,7 +71,7 @@ pub async fn test_fixed_msg_overrides_default() {
test_html! {
@@ -261,8 +261,8 @@ pub async fn test_pos_color_and_mode_changed_override_defaults() {
test_html! {
};
diff --git a/rust/perspective-viewer/src/rust/components/tests/viewer.rs b/rust/perspective-viewer/src/rust/components/tests/viewer.rs
index f486c93697..83ee55c9df 100644
--- a/rust/perspective-viewer/src/rust/components/tests/viewer.rs
+++ b/rust/perspective-viewer/src/rust/components/tests/viewer.rs
@@ -44,7 +44,7 @@ async fn set_up_html() -> (WeakScope, web_sys::ShadowRoot, Se
dragdrop={ dragdrop }
renderer={ renderer }
session={ session.clone() }
- custom_events={events}
+ custom_events={ events }
presentation={ theme }>
};
diff --git a/rust/perspective-viewer/src/rust/components/viewer.rs b/rust/perspective-viewer/src/rust/components/viewer.rs
index 7e3e53c95e..3d4f3c08f9 100644
--- a/rust/perspective-viewer/src/rust/components/viewer.rs
+++ b/rust/perspective-viewer/src/rust/components/viewer.rs
@@ -155,7 +155,7 @@ impl Component for PerspectiveViewer {
PerspectiveViewerMsg::Resize => {
self.on_resize.emit_all(());
false
- }
+ },
PerspectiveViewerMsg::Reset(all, sender) => {
self.selected_column = None;
clone!(
@@ -177,7 +177,7 @@ impl Component for PerspectiveViewer {
});
needs_update
- }
+ },
PerspectiveViewerMsg::ToggleSettingsInit(Some(SettingsUpdate::Missing), None) => false,
PerspectiveViewerMsg::ToggleSettingsInit(
Some(SettingsUpdate::Missing),
@@ -185,22 +185,22 @@ impl Component for PerspectiveViewer {
) => {
resolve.send(Ok(JsValue::UNDEFINED)).unwrap();
false
- }
+ },
PerspectiveViewerMsg::ToggleSettingsInit(Some(SettingsUpdate::SetDefault), resolve) => {
self.init_toggle_settings_task(ctx, Some(false), resolve);
false
- }
+ },
PerspectiveViewerMsg::ToggleSettingsInit(
Some(SettingsUpdate::Update(force)),
resolve,
) => {
self.init_toggle_settings_task(ctx, Some(force), resolve);
false
- }
+ },
PerspectiveViewerMsg::ToggleSettingsInit(None, resolve) => {
self.init_toggle_settings_task(ctx, None, resolve);
false
- }
+ },
PerspectiveViewerMsg::ToggleSettingsComplete(SettingsUpdate::SetDefault, resolve)
if self.settings_open =>
{
@@ -208,7 +208,7 @@ impl Component for PerspectiveViewer {
self.settings_open = false;
self.on_rendered = Some(resolve);
true
- }
+ },
PerspectiveViewerMsg::ToggleSettingsComplete(
SettingsUpdate::Update(force),
resolve,
@@ -217,19 +217,19 @@ impl Component for PerspectiveViewer {
self.settings_open = force;
self.on_rendered = Some(resolve);
true
- }
+ },
PerspectiveViewerMsg::ToggleSettingsComplete(_, resolve)
if matches!(self.fonts.get_status(), FontLoaderStatus::Finished) =>
{
self.selected_column = None;
resolve.send(()).expect("Orphan render");
false
- }
+ },
PerspectiveViewerMsg::ToggleSettingsComplete(_, resolve) => {
self.selected_column = None;
self.on_rendered = Some(resolve);
true
- }
+ },
PerspectiveViewerMsg::RenderLimits(dimensions) => {
if self.dimensions != dimensions {
self.dimensions = dimensions;
@@ -237,7 +237,7 @@ impl Component for PerspectiveViewer {
} else {
false
}
- }
+ },
PerspectiveViewerMsg::ToggleColumnSettings(selected_column, sender) => {
let (open, column_name) = if self.selected_column == selected_column {
self.selected_column = None;
@@ -262,23 +262,23 @@ impl Component for PerspectiveViewer {
sender.send(()).unwrap();
}
true
- }
+ },
PerspectiveViewerMsg::SettingsPanelSizeUpdate(Some(x)) => {
self.settings_panel_width_override = Some(x);
false
- }
+ },
PerspectiveViewerMsg::SettingsPanelSizeUpdate(None) => {
self.settings_panel_width_override = None;
false
- }
+ },
PerspectiveViewerMsg::ColumnSettingsPanelSizeUpdate(Some(x)) => {
self.column_settings_panel_width_override = Some(x);
false
- }
+ },
PerspectiveViewerMsg::ColumnSettingsPanelSizeUpdate(None) => {
self.column_settings_panel_width_override = None;
false
- }
+ },
}
}
@@ -398,9 +398,8 @@ impl Component for PerspectiveViewer {
renderer={ &ctx.props().renderer }
custom_events={ &ctx.props().custom_events }
{ selected_column }
- on_close={ctx.link().callback(|_| PerspectiveViewerMsg::ToggleColumnSettings(None, None))}
- width_override={self.column_settings_panel_width_override}
- />
+ on_close={ ctx.link().callback(|_| PerspectiveViewerMsg::ToggleColumnSettings(None, None)) }
+ width_override={ self.column_settings_panel_width_override }/>
<>>
}
@@ -466,7 +465,7 @@ impl PerspectiveViewer {
if let Some(sender) = sender {
sender.send(Ok(JsValue::UNDEFINED)).unwrap();
}
- }
+ },
Some(_) | None => {
let force = !is_open;
let callback = ctx.link().callback(move |resolve| {
@@ -490,7 +489,7 @@ impl PerspectiveViewer {
result
});
- }
+ },
};
}
}
diff --git a/rust/perspective-viewer/src/rust/config/aggregates.rs b/rust/perspective-viewer/src/rust/config/aggregates.rs
index debd8f47ec..d3cdb93bd2 100644
--- a/rust/perspective-viewer/src/rust/config/aggregates.rs
+++ b/rust/perspective-viewer/src/rust/config/aggregates.rs
@@ -191,7 +191,7 @@ impl Display for Aggregate {
Self::SingleAggregate(x) => write!(fmt, "{}", x)?,
Self::MultiAggregate(MultiAggregate::WeightedMean, x) => {
write!(fmt, "weighted mean by {}", x)?
- }
+ },
};
Ok(())
}
@@ -272,7 +272,7 @@ impl Type {
match self {
Self::Bool | Self::Date | Self::Datetime | Self::String => {
Aggregate::SingleAggregate(SingleAggregate::Count)
- }
+ },
Self::Integer | Self::Float => Aggregate::SingleAggregate(SingleAggregate::Sum),
}
}
diff --git a/rust/perspective-viewer/src/rust/config/expressions.rs b/rust/perspective-viewer/src/rust/config/expressions.rs
index 96bebc3b09..c1c3589609 100644
--- a/rust/perspective-viewer/src/rust/config/expressions.rs
+++ b/rust/perspective-viewer/src/rust/config/expressions.rs
@@ -33,30 +33,28 @@ impl std::ops::Deref for Expressions {
&self.0
}
}
+
impl std::ops::DerefMut for Expressions {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
+fn upgrade_legacy_format(expressions: &[String]) -> HashMap {
+ tracing::warn!("Legacy `expressions` format: {:?}", expressions);
+ expressions.iter().map(|s| {
+ if let Some((name, expression)) = s.split_once('\n') && !expression.is_empty() && name.starts_with("//") {
+ (name.split_at(2).1.trim().to_owned(), expression.to_owned())
+ } else {
+ (s.to_owned(), s.to_owned())
+ }
+ }).collect::>()
+}
+
impl From for Expressions {
fn from(value: ExpressionsDeserde) -> Self {
- let change = |expressions: &[String]| {
- expressions.iter().map(|s| {
- if let Some((name, expression)) = s.split_once('\n') && !expression.is_empty() && name.starts_with("//") {
- (name.split_at(2).1.trim().to_owned(), expression.to_owned())
- } else {
- // name = first 25 chars of the expr
- let name = match s.char_indices().nth(25) {
- None => s.to_owned(),
- Some((idx, _)) => s[..idx].to_owned(),
- };
- (name, s.to_owned())
- }
- }).collect::>()
- };
match value {
- ExpressionsDeserde::Array(arr) => Self(change(&arr)),
+ ExpressionsDeserde::Array(arr) => Self(upgrade_legacy_format(&arr)),
ExpressionsDeserde::Map(map) => Self(map),
}
}
@@ -67,6 +65,7 @@ pub struct Expression<'a> {
pub name: Cow<'a, str>,
pub expression: Cow<'a, str>,
}
+
impl<'a> Expression<'a> {
pub fn new(name: &'a str, expression: &'a str) -> Self {
Self {
diff --git a/rust/perspective-viewer/src/rust/config/filters.rs b/rust/perspective-viewer/src/rust/config/filters.rs
index d036efc60b..34c37a23ee 100644
--- a/rust/perspective-viewer/src/rust/config/filters.rs
+++ b/rust/perspective-viewer/src/rust/config/filters.rs
@@ -142,7 +142,7 @@ impl Display for FilterTerm {
match self {
Self::Scalar(x) => {
write!(fmt, "{}", x)?;
- }
+ },
Self::Array(xs) => write!(
fmt,
"{}",
diff --git a/rust/perspective-viewer/src/rust/config/view_config.rs b/rust/perspective-viewer/src/rust/config/view_config.rs
index 3f296e54ae..eba7b795fc 100644
--- a/rust/perspective-viewer/src/rust/config/view_config.rs
+++ b/rust/perspective-viewer/src/rust/config/view_config.rs
@@ -59,7 +59,7 @@ impl ViewConfig {
Some(update) => {
*field = update;
true
- }
+ },
}
}
diff --git a/rust/perspective-viewer/src/rust/config/viewer_config.rs b/rust/perspective-viewer/src/rust/config/viewer_config.rs
index 1efe9c3d5c..362aceb453 100644
--- a/rust/perspective-viewer/src/rust/config/viewer_config.rs
+++ b/rust/perspective-viewer/src/rust/config/viewer_config.rs
@@ -114,7 +114,7 @@ impl ViewerConfig {
encoder.write_all(&bytes)?;
let encoded = encoder.finish()?;
Ok(JsValue::from(base64::encode(encoded)))
- }
+ },
Some(ViewerConfigEncoding::ArrayBuffer) => {
let mut encoder = ZlibEncoder::new(Vec::new(), Compression::default());
let bytes = rmp_serde::to_vec(&self.token())?;
@@ -127,10 +127,10 @@ impl ViewerConfig {
.buffer()
.slice_with_end(start, start + len)
.unchecked_into())
- }
+ },
Some(ViewerConfigEncoding::JSONString) => {
Ok(JsValue::from(serde_json::to_string(self)?))
- }
+ },
None | Some(ViewerConfigEncoding::Json) => Ok(JsValue::from_serde_ext(self)?),
}
}
diff --git a/rust/perspective-viewer/src/rust/custom_elements/filter_dropdown.rs b/rust/perspective-viewer/src/rust/custom_elements/filter_dropdown.rs
index a8763c5263..216c7d2566 100644
--- a/rust/perspective-viewer/src/rust/custom_elements/filter_dropdown.rs
+++ b/rust/perspective-viewer/src/rust/custom_elements/filter_dropdown.rs
@@ -93,7 +93,7 @@ impl FilterDropDownElement {
FilterDropDownMsg::SetValues(values),
]);
}
- }
+ },
_ => {
// TODO is this a race condition? `column` and `values` are out-of-sync
// across an `await` point.
@@ -117,7 +117,7 @@ impl FilterDropDownElement {
}
}
});
- }
+ },
}
}
diff --git a/rust/perspective-viewer/src/rust/custom_elements/modal.rs b/rust/perspective-viewer/src/rust/custom_elements/modal.rs
index 3ddc18fdba..e1a634962a 100644
--- a/rust/perspective-viewer/src/rust/custom_elements/modal.rs
+++ b/rust/perspective-viewer/src/rust/custom_elements/modal.rs
@@ -31,7 +31,7 @@ type BlurHandlerType = Rc>>>;
/// positioned next to any existing on-page elements, accounting for viewport,
/// scroll position, etc.
///
-///`#[derive(Clone)]` generates the trait bound `T: Clone`, which is not
+/// `#[derive(Clone)]` generates the trait bound `T: Clone`, which is not
/// required because `Scope` implements Clone without this bound; thus
/// `Clone` must be implemented by the `derivative` crate's
/// [custom bounds](https://mcarton.github.io/rust-derivative/latest/Debug.html#custom-bound)
@@ -114,7 +114,7 @@ fn calc_relative_position(
} else {
ModalAnchor::BottomLeftTopLeft
}
- }
+ },
(true, false, false, _) => ModalAnchor::BottomLeftTopLeft,
(false, true, true, _) => ModalAnchor::TopRightTopLeft,
(false, true, false, _) => {
@@ -123,7 +123,7 @@ fn calc_relative_position(
} else {
ModalAnchor::TopLeftBottomLeft
}
- }
+ },
_ => ModalAnchor::TopLeftBottomLeft,
}
}
@@ -185,10 +185,10 @@ where
ModalAnchor::BottomRightTopLeft => (top - rect_height, left - rect_width + 1.0),
ModalAnchor::BottomRightBottomLeft => {
(top - rect_height + height, left - rect_width + 1.0)
- }
+ },
ModalAnchor::BottomRightTopRight => {
(top - rect_height + 1.0, left + width - rect_width)
- }
+ },
ModalAnchor::BottomLeftTopLeft => (top - rect_height + 1.0, left),
ModalAnchor::TopRightTopLeft => (top, left - rect_width + 1.0),
ModalAnchor::TopRightBottomRight => (top + height - 1.0, left + width - rect_width),
diff --git a/rust/perspective-viewer/src/rust/custom_elements/viewer.rs b/rust/perspective-viewer/src/rust/custom_elements/viewer.rs
index 8b3ab72b19..62f2d73d34 100644
--- a/rust/perspective-viewer/src/rust/custom_elements/viewer.rs
+++ b/rust/perspective-viewer/src/rust/custom_elements/viewer.rs
@@ -216,7 +216,7 @@ impl PerspectiveViewerElement {
None => {
session.table_loaded.listen_once().await?;
Ok(session.get_table().ok_or("No table set")?)
- }
+ },
}
})
}
@@ -276,7 +276,7 @@ impl PerspectiveViewerElement {
} else {
false
}
- }
+ },
OptionalUpdate::Update(x) => {
let current_name = presentation.get_selected_theme_name().await;
if current_name.is_some() && current_name.as_ref().unwrap() != &x {
@@ -285,7 +285,7 @@ impl PerspectiveViewerElement {
} else {
false
}
- }
+ },
_ => false,
};
diff --git a/rust/perspective-viewer/src/rust/dragdrop.rs b/rust/perspective-viewer/src/rust/dragdrop.rs
index 7fd6c39f06..907e2ed28b 100644
--- a/rust/perspective-viewer/src/rust/dragdrop.rs
+++ b/rust/perspective-viewer/src/rust/dragdrop.rs
@@ -226,14 +226,14 @@ impl DragDrop {
let should_render = match &*drag_state {
DragState::DragOverInProgress(_, drag_to) => {
drag_to.target != target || drag_to.index != index
- }
+ },
_ => true,
};
*drag_state = match &*drag_state {
DragState::DragOverInProgress(drag_from, _) | DragState::DragInProgress(drag_from) => {
DragState::DragOverInProgress(drag_from.clone(), DragOver { target, index })
- }
+ },
_ => DragState::NoDrag,
};
@@ -320,7 +320,7 @@ pub fn dragleave_helper(callback: impl Fn() + 'static, drag_ref: NodeRef) -> Cal
if !current_target.contains(Some(related)) {
callback();
}
- }
+ },
None => {
// Safari (OSX and iOS) don't set `relatedTarget`, so we need to
// read a memoized value from the `"dragenter"` event.
@@ -330,7 +330,7 @@ pub fn dragleave_helper(callback: impl Fn() + 'static, drag_ref: NodeRef) -> Cal
} else {
callback();
}
- }
+ },
};
})
}
diff --git a/rust/perspective-viewer/src/rust/model/columns_iter_set.rs b/rust/perspective-viewer/src/rust/model/columns_iter_set.rs
index 7f08b3a46f..aa5b59050d 100644
--- a/rust/perspective-viewer/src/rust/model/columns_iter_set.rs
+++ b/rust/perspective-viewer/src/rust/model/columns_iter_set.rs
@@ -30,7 +30,6 @@ pub enum ActiveColumnState {
}
impl ActiveColumnState {
-
pub fn get_name(&self) -> Option<&'_ str> {
match self {
Self::Column(_, x) => Some(x.as_str()),
@@ -124,7 +123,7 @@ impl<'a> ColumnsIteratorSet<'a> {
} else {
Some(to_column.unwrap_or(&None))
}
- }
+ },
x => Some(x),
});
@@ -151,7 +150,7 @@ impl<'a> ColumnsIteratorSet<'a> {
} else {
Some(&None)
}
- }
+ },
x => Some(x),
});
@@ -166,7 +165,7 @@ impl<'a> ColumnsIteratorSet<'a> {
before_cols.chain(std::iter::once(None)).chain(after_cols),
))
}
- }
+ },
_ => {
let iter = self.config.columns.iter().map(Some);
self.to_active_column_state(if has_blank_tail {
@@ -174,7 +173,7 @@ impl<'a> ColumnsIteratorSet<'a> {
} else {
Box::new(iter.chain(std::iter::once(Some(&None))))
})
- }
+ },
}
}
diff --git a/rust/perspective-viewer/src/rust/model/copy_export.rs b/rust/perspective-viewer/src/rust/model/copy_export.rs
index 65c66ad0bc..e53f94dc21 100644
--- a/rust/perspective-viewer/src/rust/model/copy_export.rs
+++ b/rust/perspective-viewer/src/rust/model/copy_export.rs
@@ -90,35 +90,35 @@ pub trait CopyExportModel:
ExportMethod::Csv => {
let session = self.session().clone();
ApiFuture::new(async move { session.csv_as_jsvalue(false).await?.as_blob() })
- }
+ },
ExportMethod::CsvAll => {
let session = self.session().clone();
ApiFuture::new(async move { session.csv_as_jsvalue(true).await?.as_blob() })
- }
+ },
ExportMethod::Json => {
let session = self.session().clone();
ApiFuture::new(async move { session.json_as_jsvalue(false).await?.as_blob() })
- }
+ },
ExportMethod::JsonAll => {
let session = self.session().clone();
ApiFuture::new(async move { session.json_as_jsvalue(true).await?.as_blob() })
- }
+ },
ExportMethod::Arrow => {
let session = self.session().clone();
ApiFuture::new(async move { session.arrow_as_jsvalue(false).await?.as_blob() })
- }
+ },
ExportMethod::ArrowAll => {
let session = self.session().clone();
ApiFuture::new(async move { session.arrow_as_jsvalue(true).await?.as_blob() })
- }
+ },
ExportMethod::Html => {
let html_task = self.html_as_jsvalue();
ApiFuture::new(html_task)
- }
+ },
ExportMethod::Png => {
let png_task = self.png_as_jsvalue();
ApiFuture::new(png_task)
- }
+ },
ExportMethod::JsonConfig => {
let config_task = self.get_viewer_config();
ApiFuture::new(async move {
@@ -128,7 +128,7 @@ pub trait CopyExportModel:
.dyn_into::()?
.as_blob()
})
- }
+ },
}
}
}
diff --git a/rust/perspective-viewer/src/rust/renderer.rs b/rust/perspective-viewer/src/rust/renderer.rs
index 3c30237eb9..e9db7ffea9 100644
--- a/rust/perspective-viewer/src/rust/renderer.rs
+++ b/rust/perspective-viewer/src/rust/renderer.rs
@@ -320,7 +320,7 @@ impl Renderer {
Err(cont) => {
tracing::warn!("Presize took longer than {}ms", PRESIZE_TIMEOUT);
cont.await.unwrap()
- }
+ },
}
}
diff --git a/rust/perspective-viewer/src/rust/renderer/limits.rs b/rust/perspective-viewer/src/rust/renderer/limits.rs
index cd3bb1f8e5..8176474ed9 100644
--- a/rust/perspective-viewer/src/rust/renderer/limits.rs
+++ b/rust/perspective-viewer/src/rust/renderer/limits.rs
@@ -52,7 +52,7 @@ pub async fn get_row_and_col_limits(
});
Ok((num_cols, num_rows, max_cols, max_rows))
- }
+ },
}
}
diff --git a/rust/perspective-viewer/src/rust/renderer/render_timer.rs b/rust/perspective-viewer/src/rust/renderer/render_timer.rs
index 0b504e7f82..add0aa548f 100644
--- a/rust/perspective-viewer/src/rust/renderer/render_timer.rs
+++ b/rust/perspective-viewer/src/rust/renderer/render_timer.rs
@@ -88,7 +88,7 @@ impl MovingWindowRenderTimer {
} else {
*timings = Some(Default::default());
}
- }
+ },
RenderTimerType::Constant(_) => (),
};
@@ -99,10 +99,10 @@ impl MovingWindowRenderTimer {
match val {
None => {
*self.0.borrow_mut() = RenderTimerType::default();
- }
+ },
Some(val) => {
*self.0.borrow_mut() = RenderTimerType::Constant(val);
- }
+ },
}
}
@@ -122,7 +122,7 @@ impl MovingWindowRenderTimer {
} else {
0_i32
}
- }
+ },
}
}
}
diff --git a/rust/perspective-viewer/src/rust/session/drag_drop_update.rs b/rust/perspective-viewer/src/rust/session/drag_drop_update.rs
index a3ad423292..82136655b6 100644
--- a/rust/perspective-viewer/src/rust/session/drag_drop_update.rs
+++ b/rust/perspective-viewer/src/rust/session/drag_drop_update.rs
@@ -74,23 +74,23 @@ impl ViewConfig {
update.columns = Some(config.columns.clone());
}
- }
+ },
DragEffect::Move(DragTarget::GroupBy) => {
config.group_by.retain(|x| x != &column);
update.group_by = Some(config.group_by.clone());
- }
+ },
DragEffect::Move(DragTarget::SplitBy) => {
config.split_by.retain(|x| x != &column);
update.split_by = Some(config.split_by.clone());
- }
+ },
DragEffect::Move(DragTarget::Sort) => {
config.sort.retain(|x| x.0 != column);
update.sort = Some(config.sort.clone());
- }
+ },
DragEffect::Move(DragTarget::Filter) => {
config.filter.retain(|x| x.0 != column);
update.filter = Some(config.filter.clone());
- }
+ },
}
match drop {
@@ -136,24 +136,24 @@ impl ViewConfig {
update.columns = Some(config.columns);
}
- }
+ },
DragTarget::GroupBy => {
config.group_by.retain(|x| x != &column);
let index = std::cmp::min(index, config.group_by.len());
config.group_by.insert(index, column);
update.group_by = Some(config.group_by);
- }
+ },
DragTarget::SplitBy => {
config.split_by.retain(|x| x != &column);
let index = std::cmp::min(index, config.split_by.len());
config.split_by.insert(index, column);
update.split_by = Some(config.split_by);
- }
+ },
DragTarget::Sort => {
let index = std::cmp::min(index, config.sort.len());
config.sort.insert(index, Sort(column, SortDir::Asc));
update.sort = Some(config.sort);
- }
+ },
DragTarget::Filter => {
let index = std::cmp::min(index, config.filter.len());
config.filter.insert(
@@ -161,7 +161,7 @@ impl ViewConfig {
Filter(column, FilterOp::EQ, FilterTerm::Scalar(Scalar::Null)),
);
update.filter = Some(config.filter);
- }
+ },
}
update
diff --git a/rust/perspective-viewer/src/rust/session/metadata.rs b/rust/perspective-viewer/src/rust/session/metadata.rs
index 994590d02e..a2011b17cd 100644
--- a/rust/perspective-viewer/src/rust/session/metadata.rs
+++ b/rust/perspective-viewer/src/rust/session/metadata.rs
@@ -262,7 +262,7 @@ impl SessionMetadata {
Aggregate::MultiAggregate(MultiAggregate::WeightedMean, name)
});
Box::new(aggregates.chain(num_cols))
- }
+ },
_ => aggregates,
})
})
diff --git a/rust/perspective-viewer/src/rust/utils/futures.rs b/rust/perspective-viewer/src/rust/utils/futures.rs
index c4a6f2d095..aec22d9b78 100644
--- a/rust/perspective-viewer/src/rust/utils/futures.rs
+++ b/rust/perspective-viewer/src/rust/utils/futures.rs
@@ -169,11 +169,11 @@ pub impl Result {
} else {
Ok(js_intern::js_intern!(CANCELLED_MSG).clone())
}
- }
+ },
_ => match f.as_string() {
Some(x) if x == CANCELLED_MSG => {
Ok(js_intern::js_intern!(CANCELLED_MSG).clone())
- }
+ },
Some(_) => Err(x),
_ => {
if js_sys::Reflect::get(&f, js_intern::js_intern!("message"))
@@ -186,7 +186,7 @@ pub impl Result {
} else {
Err(x)
}
- }
+ },
},
}
})
diff --git a/rust/perspective-viewer/src/ts/init.ts b/rust/perspective-viewer/src/ts/init.ts
index b268263bcb..d87a47498f 100644
--- a/rust/perspective-viewer/src/ts/init.ts
+++ b/rust/perspective-viewer/src/ts/init.ts
@@ -30,15 +30,19 @@ type Module = {
memory: WebAssembly.Memory;
};
+// Perform a silly dance to deal with the different ways webpack and esbuild
+// load binary, as this may either be an `ArrayBuffer` or `URL` depening
+// on whether `inline` option was specified to `perspective-esbuild-plugin`.
async function compile(buff_or_url) {
- if (buff_or_url instanceof URL) {
+ if (buff_or_url instanceof URL || typeof buff_or_url == "string") {
return await WebAssembly.instantiateStreaming(fetch(buff_or_url));
} else {
return await WebAssembly.instantiate(buff_or_url);
}
}
-async function release_build(buff_or_url) {
+async function load_wasm() {
+ const buff_or_url = await wasm;
const mod = await compile(buff_or_url);
const exports = mod.instance.exports as Module;
const size = exports.size();
@@ -46,23 +50,6 @@ async function release_build(buff_or_url) {
const array = new Uint8Array(exports.memory.buffer);
const uncompressed_wasm = array.slice(offset, offset + size);
await wasm_module.default(uncompressed_wasm);
-}
-
-async function debug_build(buff_or_url) {
- await wasm_module.default(buff_or_url);
-}
-
-async function load_wasm() {
- // Perform a silly dance to deal with the different ways webpack and esbuild
- // load binary, as this may either be an `ArrayBuffer` or `URL` depening
- // on whether `inline` option was specified to `perspective-esbuild-plugin`.
- const buff_or_url = await wasm;
- try {
- await release_build(buff_or_url);
- } catch {
- await debug_build(buff_or_url);
- }
-
wasm_module.init();
return wasm_module;
}
diff --git a/rust/perspective-viewer/tasks/bundle/main.rs b/rust/perspective-viewer/tasks/bundle/main.rs
index 5b3dd3b1d1..7826cf79c1 100644
--- a/rust/perspective-viewer/tasks/bundle/main.rs
+++ b/rust/perspective-viewer/tasks/bundle/main.rs
@@ -70,14 +70,14 @@ fn opt(outpath: &Path) {
.one_caller_inline_max_size(15)
.run(outpath, outpath)
.unwrap();
-
- Command::new("cargo")
- .args(["run"])
- .args(["-p", "perspective-bootstrap"])
- .args(["--"])
- .args(["dist/pkg/perspective_bg.wasm"])
- .execute();
}
+
+ Command::new("cargo")
+ .args(["run"])
+ .args(["-p", "perspective-bootstrap"])
+ .args(["--"])
+ .args(["dist/pkg/perspective_bg.wasm"])
+ .execute();
}
fn main() {
diff --git a/rust/perspective-viewer/test/js/expressions.spec.js b/rust/perspective-viewer/test/js/expressions.spec.js
index a19c050549..b1e322b1c1 100644
--- a/rust/perspective-viewer/test/js/expressions.spec.js
+++ b/rust/perspective-viewer/test/js/expressions.spec.js
@@ -187,7 +187,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["1 + 2", "// abc \n3 + 4"],
+ expressions: { "1 + 2": "1 + 2", abc: "3 + 4" },
});
return elem.shadowRoot.querySelector("#sub-columns").innerHTML;
});
@@ -202,7 +202,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["// 4 + 5 \n3 + 4"],
+ expressions: { "4 + 5": "3 + 4" },
});
});
@@ -229,7 +229,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["3 + 4"],
+ expressions: { "3 + 4": "3 + 4" },
});
});
@@ -259,7 +259,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.reset(true);
});
@@ -284,7 +284,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.reset(false);
});
@@ -307,7 +307,7 @@ test.describe("Expressions", () => {
await elem.toggleConfig(true);
await elem.restore({
columns: ["1 + 2"],
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.reset(true);
});
@@ -333,7 +333,7 @@ test.describe("Expressions", () => {
await elem.toggleConfig(true);
await elem.restore({
columns: ["1 + 2"],
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.reset(false);
});
@@ -359,7 +359,7 @@ test.describe("Expressions", () => {
group_by: ["3 + 4"],
sort: [["1 + 2", "asc"]],
filter: [["1 + 2", "==", 3]],
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.reset(true);
});
@@ -384,7 +384,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.restore({
columns: ["State"],
@@ -432,7 +432,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ["3 + 4", "1 + 2"],
+ expressions: { "3 + 4": "3 + 4", "1 + 2": "1 + 2" },
});
await elem.restore({
columns: ["3 + 4"],
@@ -454,7 +454,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ['"Sales" + 100'],
+ expressions: { '"Sales" + 100': '"Sales" + 100' },
aggregates: { '"Sales" + 100': "avg" },
group_by: ["State"],
columns: ['"Sales" + 100'],
@@ -476,7 +476,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ['"Sales" + 100'],
+ expressions: { '"Sales" + 100': '"Sales" + 100' },
sort: [['"Sales" + 100', "asc"]],
columns: ["Row ID"],
});
@@ -497,7 +497,7 @@ test.describe("Expressions", () => {
const elem = document.querySelector("perspective-viewer");
await elem.toggleConfig(true);
await elem.restore({
- expressions: ['"Sales" + 100'],
+ expressions: { '"Sales" + 100': '"Sales" + 100' },
filter: [['"Sales" + 100', ">", 150]],
columns: ["Row ID", '"Sales" + 100'],
});
diff --git a/tools/perspective-bench/src/js/worker.js b/tools/perspective-bench/src/js/worker.js
index d99da636e5..e391eede98 100644
--- a/tools/perspective-bench/src/js/worker.js
+++ b/tools/perspective-bench/src/js/worker.js
@@ -195,7 +195,7 @@ async function view_suite() {
});
// await benchmark({
- // name: `.view({expressions: ["Sales" + "Profit"]})`,
+ // name: `.view({expressions: ["Sales" + "Profit"].reduce((x, y) => Object.assign(x, {[y]: y}), {})})`,
// before_all,
// after_all,
// after,
@@ -209,13 +209,13 @@ async function view_suite() {
// return await table.view({
// columns,
// group_by: ["Product Name"],
- // expressions: [`"Sales" + "Profit"`],
+ // expressions: [`"Sales" + "Profit"`].reduce((x, y) => Object.assign(x, {[y]: y}), {}),
// });
// } else {
// return await table.view({
// columns,
// row_pivots: ["Product Name"],
- // expressions: [`"Sales" + "Profit"`],
+ // expressions: [`"Sales" + "Profit"`].reduce((x, y) => Object.assign(x, {[y]: y}), {}),
// });
// }
// },
diff --git a/tools/perspective-scripts/update_python.mjs b/tools/perspective-scripts/update_python.mjs
index e710c64a21..248442e6aa 100644
--- a/tools/perspective-scripts/update_python.mjs
+++ b/tools/perspective-scripts/update_python.mjs
@@ -46,10 +46,13 @@ for (const version of VERSIONS) {
if (a.metadata.name > b.metadata.name) return 1;
return 0;
});
+
for (const {
metadata: { version, name },
} of sortedInstalls) {
- output += `${name}==${version}\n`;
+ if (name !== "perspective-python") {
+ output += `${name}==${version}\n`;
+ }
}
fs.writeFileSync(