Repository: jtablesaw/tablesaw
Pull request #1234 (2023-09-11 19:09:41)

Add an open action to browse method. 
Thanks for contributing.

- [ X] Tick to sign-off your agreement to the [Developer Certificate of Origin (DCO) 1.1](https://developercertificate.org)

## Description

This pull request adds an 'open' action to the browse method. The browse method was previously not supported in xdg, so this change makes it possible to use the browse method on platforms that support xdg by using the action 'open'. 
https://wiki.archlinux.org/title/Xdg-utils

## Testing

None.


Patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9aa2852b..cfbbf233 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -14,7 +14,7 @@ jobs:
       fail-fast: false
       matrix:
         # Test the Java LTS versions and latest version available
-        java-version: [11, 17]
+        java-version: [11, 23]
         os: [macOS-latest, ubuntu-latest, windows-latest]
     steps:
       - name: Checkout
diff --git a/arrow/pom.xml b/arrow/pom.xml
index 6c2585a4..49942a4b 100644
--- a/arrow/pom.xml
+++ b/arrow/pom.xml
@@ -88,18 +88,18 @@
     <dependency>
       <groupId>org.apache.arrow</groupId>
       <artifactId>arrow-vector</artifactId>
-      <version>7.0.0</version>
+      <version>15.0.1</version>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
-      <version>2.13.2</version>
+      <version>2.17.0</version>
     </dependency>
 
     <dependency>
       <groupId>org.apache.arrow</groupId>
       <artifactId>arrow-memory-netty</artifactId>
-      <version>7.0.0</version>
+      <version>15.0.1</version>
       <exclusions>
         <exclusion>
           <groupId>com.fasterxml.jackson.core</groupId>
diff --git a/core/pom.xml b/core/pom.xml
index 351f3fca..f6069972 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -56,7 +56,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
-                <version>3.0.2</version>
+                <version>3.3.0</version>
                 <executions>
                     <execution>
                         <goals>
@@ -76,7 +76,7 @@
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>32.0.0-jre</version>
+            <version>33.0.0-jre</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
@@ -86,12 +86,12 @@
         <dependency>
             <groupId>it.unimi.dsi</groupId>
             <artifactId>fastutil</artifactId>
-            <version>8.4.4</version>
+            <version>8.5.13</version>
         </dependency>
        <dependency>
             <groupId>org.roaringbitmap</groupId>
             <artifactId>RoaringBitmap</artifactId>
-            <version>0.9.39</version>
+            <version>1.0.5</version>
         </dependency>
         <dependency>
             <groupId>com.univocity</groupId>
@@ -101,12 +101,12 @@
         <dependency>
             <groupId>com.ibm.icu</groupId>
             <artifactId>icu4j</artifactId>
-            <version>72.1</version>
+            <version>74.2</version>
         </dependency>
         <dependency>
             <groupId>io.github.classgraph</groupId>
             <artifactId>classgraph</artifactId>
-            <version>4.8.155</version>
+            <version>4.8.168</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -132,25 +132,25 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>3.12.0</version>
+            <version>3.14.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-text</artifactId>
-            <version>1.10.0</version>
+            <version>1.11.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>com.github.jbellis</groupId>
             <artifactId>jamm</artifactId> <!-- Memory usage testing -->
-            <version>0.3.3</version>
+            <version>0.4.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
-            <version>2.2.220</version>
+            <version>2.2.224</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -168,7 +168,7 @@
         <dependency>
             <groupId>com.google.jimfs</groupId>
             <artifactId>jimfs</artifactId>
-            <version>1.2</version>
+            <version>1.3.0</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/excel/pom.xml b/excel/pom.xml
index 25084a94..1bcacb80 100644
--- a/excel/pom.xml
+++ b/excel/pom.xml
@@ -71,7 +71,7 @@
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
-          <version>5.2.2</version>
+          <version>5.2.5</version>
       </dependency>
     <dependency>
       <groupId>org.junit.jupiter</groupId>
diff --git a/html/pom.xml b/html/pom.xml
index 7d0bdc0d..9ea8593a 100644
--- a/html/pom.xml
+++ b/html/pom.xml
@@ -70,7 +70,7 @@
     <dependency>
       <groupId>org.jsoup</groupId>
       <artifactId>jsoup</artifactId>
-      <version>1.15.3</version>
+      <version>1.17.2</version>
     </dependency>
     <dependency>
       <groupId>org.junit.jupiter</groupId>
diff --git a/json/pom.xml b/json/pom.xml
index 13db2516..b68faa9f 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -78,7 +78,7 @@
     <dependency>
       <groupId>com.github.wnameless.json</groupId>
       <artifactId>json-flattener</artifactId>
-      <version>0.16.4</version>
+      <version>0.16.6</version>
     </dependency>
     <dependency>
       <groupId>org.junit.jupiter</groupId>
diff --git a/jsplot/pom.xml b/jsplot/pom.xml
index 3d3f50b7..372baf2b 100644
--- a/jsplot/pom.xml
+++ b/jsplot/pom.xml
@@ -69,7 +69,7 @@
         <dependency>
             <groupId>io.pebbletemplates</groupId>
             <artifactId>pebble</artifactId>
-            <version>3.1.6</version>
+            <version>3.2.2</version>
         </dependency>
         <dependency>
             <groupId>tech.tablesaw</groupId>
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/api/PricePlot.java b/jsplot/src/main/java/tech/tablesaw/plotly/api/PricePlot.java
index b0f11efa..be604922 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/api/PricePlot.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/api/PricePlot.java
@@ -27,17 +27,17 @@ public abstract class PricePlot {
     NumericColumn<?> low = table.numberColumn(lowCol);
     NumericColumn<?> close = table.numberColumn(closeCol);
     ScatterTrace trace;
-    if (x.type() == ColumnType.LOCAL_DATE) {
+    if (ColumnType.LOCAL_DATE.equals(x.type())) {
       trace =
           ScatterTrace.builder(table.dateColumn(xCol), open, high, low, close)
               .type(plotType)
               .build();
-    } else if (x.type() == ColumnType.LOCAL_DATE_TIME) {
+    } else if (ColumnType.LOCAL_DATE_TIME.equals(x.type())) {
       trace =
           ScatterTrace.builder(table.dateTimeColumn(xCol), open, high, low, close)
               .type(plotType)
               .build();
-    } else if (x.type() == ColumnType.INSTANT) {
+    } else if (ColumnType.INSTANT.equals(x.type())) {
       trace =
           ScatterTrace.builder(table.instantColumn(xCol), open, high, low, close)
               .type(plotType)
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/components/Component.java b/jsplot/src/main/java/tech/tablesaw/plotly/components/Component.java
index 6f8a8a38..d9af9988 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/components/Component.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/components/Component.java
@@ -3,9 +3,9 @@ package tech.tablesaw.plotly.components;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
-import com.mitchellbosecke.pebble.PebbleEngine;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.PebbleEngine;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/components/Figure.java b/jsplot/src/main/java/tech/tablesaw/plotly/components/Figure.java
index 47352e46..99421ee8 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/components/Figure.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/components/Figure.java
@@ -1,9 +1,6 @@
 package tech.tablesaw.plotly.components;
 
 import com.google.common.base.Preconditions;
-import com.mitchellbosecke.pebble.PebbleEngine;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
@@ -13,6 +10,10 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
+import io.pebbletemplates.pebble.PebbleEngine;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import tech.tablesaw.plotly.event.EventHandler;
 import tech.tablesaw.plotly.traces.Trace;
 
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/components/Layout.java b/jsplot/src/main/java/tech/tablesaw/plotly/components/Layout.java
index fdc2571f..30a25873 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/components/Layout.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/components/Layout.java
@@ -1,14 +1,15 @@
 package tech.tablesaw.plotly.components;
 
-import com.mitchellbosecke.pebble.PebbleEngine;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
 import java.io.Writer;
 import java.util.HashMap;
 import java.util.Map;
+
+import io.pebbletemplates.pebble.PebbleEngine;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import tech.tablesaw.plotly.components.threeD.Scene;
 
 public class Layout {
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/components/TemplateUtils.java b/jsplot/src/main/java/tech/tablesaw/plotly/components/TemplateUtils.java
index 7a85336e..a5fd6086 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/components/TemplateUtils.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/components/TemplateUtils.java
@@ -1,11 +1,12 @@
 package tech.tablesaw.plotly.components;
 
-import com.mitchellbosecke.pebble.PebbleEngine;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.loader.ClasspathLoader;
-import com.mitchellbosecke.pebble.loader.DelegatingLoader;
-import com.mitchellbosecke.pebble.loader.FileLoader;
-import com.mitchellbosecke.pebble.loader.Loader;
+import io.pebbletemplates.pebble.PebbleEngine;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.loader.ClasspathLoader;
+import io.pebbletemplates.pebble.loader.DelegatingLoader;
+import io.pebbletemplates.pebble.loader.FileLoader;
+import io.pebbletemplates.pebble.loader.Loader;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/components/TickSettings.java b/jsplot/src/main/java/tech/tablesaw/plotly/components/TickSettings.java
index c39c2bf2..9ddb7490 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/components/TickSettings.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/components/TickSettings.java
@@ -51,7 +51,7 @@ public class TickSettings {
 
   /** Controls the display of prefixes, suffixes, and exponents on ticks */
   public enum DisplayRules {
-    ALL("outside"),
+    ALL("all"),
     FIRST("first"),
     LAST("last"),
     NONE("none");
@@ -132,6 +132,7 @@ public class TickSettings {
   private final int angle;
   private final String prefix;
   private final String suffix;
+  private final String format;
   private final boolean autoMargin;
   private final DisplayRules showPrefix;
   private final DisplayRules showSuffix;
@@ -167,6 +168,7 @@ public class TickSettings {
     angle = builder.angle;
     prefix = builder.prefix;
     suffix = builder.suffix;
+    format = builder.format;
     mirror = builder.mirror;
     separateThousands = builder.separateThousands;
   }
@@ -204,6 +206,7 @@ public class TickSettings {
     context.put("suffix", suffix);
     context.put("showPrefix", showPrefix);
     context.put("showSuffix", showSuffix);
+    context.put("format", format);
     context.put("angle", angle);
     context.put("autoMargin", autoMargin);
     context.put("tickMode", tickMode);
@@ -239,6 +242,7 @@ public class TickSettings {
     private boolean autoMargin = true;
     private DisplayRules showPrefix = ALL;
     private DisplayRules showSuffix = ALL;
+    private String format;
     private Mirror mirror;
     private boolean separateThousands;
 
@@ -399,6 +403,11 @@ public class TickSettings {
       return this;
     }
 
+    public TickSettings.TickSettingsBuilder format(String format) {
+      this.format = format;
+      return this;
+    }
+
     /**
      * TODO: this is pretty hack-y. Add a separate method for dealing with dates and maybe clean up
      * logs too
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/components/threeD/Scene.java b/jsplot/src/main/java/tech/tablesaw/plotly/components/threeD/Scene.java
index 9041853e..7d63f341 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/components/threeD/Scene.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/components/threeD/Scene.java
@@ -1,7 +1,7 @@
 package tech.tablesaw.plotly.components.threeD;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/display/Browser.java b/jsplot/src/main/java/tech/tablesaw/plotly/display/Browser.java
index 5cc4e47c..3f6fa968 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/display/Browser.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/display/Browser.java
@@ -16,8 +16,13 @@ public class Browser {
 
   public void browse(File file) throws IOException {
     if (Desktop.isDesktopSupported()) {
-
-      Desktop.getDesktop().browse(file.toURI());
+      if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
+        Desktop.getDesktop().browse(file.toURI());
+      } else if (Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) {
+        Desktop.getDesktop().open(file);
+      } else {
+        throw new UnsupportedOperationException("Neither open nor browse are supported");
+      }
     } else {
       throw new UnsupportedOperationException("Browser not supported.");
     }
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/AbstractTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/AbstractTrace.java
index 0c4baebb..09a1e95d 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/AbstractTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/AbstractTrace.java
@@ -1,8 +1,9 @@
 package tech.tablesaw.plotly.traces;
 
-import com.mitchellbosecke.pebble.PebbleEngine;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.PebbleEngine;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
+
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/BarTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/BarTrace.java
index 36f54ce2..e36690af 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/BarTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/BarTrace.java
@@ -2,8 +2,8 @@ package tech.tablesaw.plotly.traces;
 
 import static tech.tablesaw.plotly.Utils.dataAsString;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/BoxTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/BoxTrace.java
index dd2d3db0..ed484990 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/BoxTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/BoxTrace.java
@@ -2,8 +2,8 @@ package tech.tablesaw.plotly.traces;
 
 import static tech.tablesaw.plotly.Utils.dataAsString;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/ContourTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/ContourTrace.java
index aebee67c..7c82143b 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/ContourTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/ContourTrace.java
@@ -1,7 +1,7 @@
 package tech.tablesaw.plotly.traces;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 
 import java.io.IOException;
 import java.io.StringWriter;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/HeatmapTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/HeatmapTrace.java
index 6aea6b76..97928ac8 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/HeatmapTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/HeatmapTrace.java
@@ -2,8 +2,8 @@ package tech.tablesaw.plotly.traces;
 
 import static tech.tablesaw.plotly.Utils.dataAsString;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/Histogram2DTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/Histogram2DTrace.java
index 82c30c6a..c9b061ab 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/Histogram2DTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/Histogram2DTrace.java
@@ -1,7 +1,7 @@
 package tech.tablesaw.plotly.traces;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/HistogramTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/HistogramTrace.java
index fc8e476a..23893f79 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/HistogramTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/HistogramTrace.java
@@ -1,7 +1,7 @@
 package tech.tablesaw.plotly.traces;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/PieTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/PieTrace.java
index 02af6ad2..47ec1223 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/PieTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/PieTrace.java
@@ -1,7 +1,7 @@
 package tech.tablesaw.plotly.traces;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/Scatter3DTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/Scatter3DTrace.java
index 7ce39c2f..89a99d20 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/Scatter3DTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/Scatter3DTrace.java
@@ -3,8 +3,8 @@ package tech.tablesaw.plotly.traces;
 import static tech.tablesaw.plotly.Utils.dataAsString;
 
 import com.google.common.base.Preconditions;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/ScatterTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/ScatterTrace.java
index 0a3eb7df..7e8ee6fd 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/ScatterTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/ScatterTrace.java
@@ -3,8 +3,8 @@ package tech.tablesaw.plotly.traces;
 import static tech.tablesaw.plotly.Utils.dataAsString;
 
 import com.google.common.base.Preconditions;
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/java/tech/tablesaw/plotly/traces/ViolinTrace.java b/jsplot/src/main/java/tech/tablesaw/plotly/traces/ViolinTrace.java
index a9a545bf..ccc02e69 100644
--- a/jsplot/src/main/java/tech/tablesaw/plotly/traces/ViolinTrace.java
+++ b/jsplot/src/main/java/tech/tablesaw/plotly/traces/ViolinTrace.java
@@ -2,8 +2,8 @@ package tech.tablesaw.plotly.traces;
 
 import static tech.tablesaw.plotly.Utils.dataAsString;
 
-import com.mitchellbosecke.pebble.error.PebbleException;
-import com.mitchellbosecke.pebble.template.PebbleTemplate;
+import io.pebbletemplates.pebble.error.PebbleException;
+import io.pebbletemplates.pebble.template.PebbleTemplate;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.UncheckedIOException;
diff --git a/jsplot/src/main/resources/axis_template.html b/jsplot/src/main/resources/axis_template.html
index 757e9427..18d20635 100644
--- a/jsplot/src/main/resources/axis_template.html
+++ b/jsplot/src/main/resources/axis_template.html
@@ -28,6 +28,21 @@
 {% if tick0 is not null %}
     tick0: '{{tick0}}',
 {% endif %}
+{% if showPrefix is not null %}
+    showtickprefix: '{{showPrefix}}',
+{% endif %}
+{% if showSuffix is not null %}
+    showticksuffix: '{{showSuffix}}',
+{% endif %}
+{% if prefix is not null %}
+    tickprefix: '{{prefix}}',
+{% endif %}
+{% if suffix is not null %}
+    ticksuffix: '{{suffix}}',
+{% endif %}
+{% if format is not null %}
+    tickformat: '{{format}}',
+{% endif %}
 {% if showExponent is not null %}
     showExponent: '{{showExponent}}',
 {% endif %}
@@ -85,7 +100,7 @@
     type: '{{type}}',
 {% endif %}
 {% if range is not null %}
-    range: {{range | raw}}
+    range: {{range | raw}},
 {% endif %}
 {% if visible is not null %}
     visible: {{visible}},
diff --git a/pom.xml b/pom.xml
index 0406ba12..955b9505 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,6 +72,11 @@
                         <groupId>org.sonatype.plugins</groupId>
                         <artifactId>nexus-staging-maven-plugin</artifactId>
                     </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>versions-maven-plugin</artifactId>
+                        <version>2.16.2</version>
+                    </plugin>
                 </plugins>
             </build>
         </profile>
@@ -117,7 +122,7 @@
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-surefire-plugin</artifactId>
-                    <version>3.0.0-M9</version>
+                    <version>3.2.5</version>
                 </plugin>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
@@ -269,32 +274,32 @@
             <dependency>
                 <groupId>com.fasterxml.jackson.core</groupId>
                 <artifactId>jackson-core</artifactId>
-                <version>2.13.2</version>
+                <version>2.17.0</version>
             </dependency>
             <dependency>
                 <groupId>com.fasterxml.jackson.core</groupId>
                 <artifactId>jackson-databind</artifactId>
-                <version>2.13.4.2</version>
+                <version>2.17.0</version>
             </dependency>
             <dependency>
                 <groupId>com.fasterxml.jackson.datatype</groupId>
                 <artifactId>jackson-datatype-jsr310</artifactId>
-                <version>2.13.2</version>
+                <version>2.17.0</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-api</artifactId>
-                <version>1.7.30</version>
+                <version>2.0.12</version>
             </dependency>
             <dependency>
                 <groupId>org.junit.jupiter</groupId>
                 <artifactId>junit-jupiter-engine</artifactId>
-                <version>5.5.2</version>
+                <version>5.10.2</version>
             </dependency>
             <dependency>
                 <groupId>org.junit.jupiter</groupId>
                 <artifactId>junit-jupiter-params</artifactId>
-                <version>5.5.2</version>
+                <version>5.10.2</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
diff --git a/saw/pom.xml b/saw/pom.xml
index 69a839d9..f4dd207b 100644
--- a/saw/pom.xml
+++ b/saw/pom.xml
@@ -74,7 +74,7 @@
     <dependency>
       <groupId>org.iq80.snappy</groupId>
       <artifactId>snappy</artifactId>
-      <version>0.4</version>
+      <version>0.5</version>
     </dependency>
     <dependency>
       <groupId>org.lz4</groupId>


Test patch:
diff --git a/jsplot/src/test/java/tech/tablesaw/plotly/OhlcTest.java b/jsplot/src/test/java/tech/tablesaw/plotly/OhlcTest.java
new file mode 100644
index 00000000..cc1d5335
--- /dev/null
+++ b/jsplot/src/test/java/tech/tablesaw/plotly/OhlcTest.java
@@ -0,0 +1,47 @@
+package tech.tablesaw.plotly;
+
+import org.junit.jupiter.api.Test;
+import tech.tablesaw.api.DateTimeColumn;
+import tech.tablesaw.api.DoubleColumn;
+import tech.tablesaw.api.Table;
+import tech.tablesaw.plotly.api.OHLCPlot;
+import tech.tablesaw.plotly.components.Figure;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class OhlcTest {
+
+    @Test
+    void ohlcPlotDoesNotThrowIllegalArgumentException() {
+        // Test to fix bug reported at https://github.com/jtablesaw/tablesaw/issues/1237
+        String timeTitle = "time";
+        String openTitle = "open";
+        String closeTitle = "close";
+        String highTitle = "high";
+        String lowTitle = "low";
+        String graphTitle = "title";
+
+        LocalDateTime now = LocalDateTime.now();
+        List<LocalDateTime> time = List.of(now, now.plusSeconds(5), now.plusSeconds(10));
+        List<Double> open = List.of(1d, 2d, 3d);
+        List<Double> close = List.of(1d, 2d, 3d);
+        List<Double> high = List.of(1d, 2d, 3d);
+        List<Double> low = List.of(1d, 2d, 3d);
+
+        DateTimeColumn timeColumn = DateTimeColumn.create(timeTitle, time);
+        DoubleColumn openColumn = DoubleColumn.create(openTitle, open);
+        DoubleColumn closeColumn = DoubleColumn.create(closeTitle, close);
+        DoubleColumn highColumn = DoubleColumn.create(highTitle, high);
+        DoubleColumn lowColumn = DoubleColumn.create(lowTitle, low);
+
+        Table priceTable = Table.create(timeColumn, openColumn, closeColumn, highColumn, lowColumn);
+        Figure figure = OHLCPlot.create(graphTitle, priceTable, timeTitle, openTitle, highTitle, lowTitle, closeTitle);
+
+        assertNotNull(figure);
+        assertDoesNotThrow(() -> IllegalArgumentException.class);
+    }
+}