Skip to content

Commit 566abbb

Browse files
Use data-class everywhere (#129)
This adds convenient `with…` methods to all of those former case classes in particular. And should make it easier to preserve binary compatibility when adding fields to them.
1 parent ae4b02c commit 566abbb

24 files changed

+85
-34
lines changed

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ inThisBuild(List(
2222
lazy val core = crossProject(JVMPlatform, JSPlatform)
2323
.settings(
2424
shared,
25-
plotlyPrefix
25+
plotlyPrefix,
26+
libraryDependencies += Deps.dataClass
2627
)
2728

2829
lazy val coreJvm = core.jvm

core/shared/src/main/scala/plotly/Trace.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import scala.language.implicitConversions
44

55
import java.lang.{ Boolean => JBoolean, Double => JDouble }
66

7+
import dataclass.data
78
import plotly.element._
89

910
sealed abstract class Trace extends Product with Serializable
1011

11-
final case class Scatter(
12+
@data class Scatter(
1213
x: Option[Sequence],
1314
y: Option[Sequence],
1415
text: Option[OneOrSeq[String]],
@@ -88,7 +89,7 @@ object Scatter {
8889
}
8990
}
9091

91-
case class Box(
92+
@data class Box(
9293
y: Option[Sequence],
9394
x: Option[Sequence],
9495
boxpoints: Option[BoxPoints],
@@ -137,7 +138,7 @@ object Box {
137138
)
138139
}
139140

140-
final case class Bar(
141+
@data class Bar(
141142
x: Sequence,
142143
y: Sequence,
143144
name: Option[String],
@@ -192,7 +193,7 @@ object Bar {
192193
)
193194
}
194195

195-
case class Histogram(
196+
@data class Histogram(
196197
x: Option[Sequence],
197198
y: Option[Sequence],
198199
opacity: Option[Double],
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package plotly
22
package element
33

4+
import dataclass.data
5+
46
sealed abstract class AxisAnchor(val label: String) extends Product with Serializable
57

68
object AxisAnchor {
7-
case class Reference(axisReference: AxisReference) extends AxisAnchor(axisReference.label)
9+
@data class Reference(axisReference: AxisReference) extends AxisAnchor(axisReference.label)
810
case object Free extends AxisAnchor("free")
911
case object Y extends AxisAnchor("y")
1012
}
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
package plotly.element
22

3-
case class Bins(start: Double, end: Double, size: Double)
3+
import dataclass.data
4+
5+
@data class Bins(
6+
start: Double,
7+
end: Double,
8+
size: Double
9+
)

core/shared/src/main/scala/plotly/element/BoxMean.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package plotly
22
package element
33

4+
import dataclass.data
5+
46
sealed abstract class BoxMean extends Product with Serializable
57

68
object BoxMean {
7-
case class Bool(value: Boolean) extends BoxMean
9+
@data class Bool(value: Boolean) extends BoxMean
810
sealed abstract class Labeled(val label: String) extends BoxMean
911

1012
val True = Bool(true)

core/shared/src/main/scala/plotly/element/BoxPoints.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package plotly
22
package element
33

4+
import dataclass.data
5+
46
sealed abstract class BoxPoints extends Product with Serializable
57

68
object BoxPoints {
7-
case class Bool(value: Boolean) extends BoxPoints
9+
@data class Bool(value: Boolean) extends BoxPoints
810
sealed abstract class Labeled(val label: String) extends BoxPoints
911

1012
val False = Bool(false)

core/shared/src/main/scala/plotly/element/Color.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package plotly
22
package element
33

4+
import dataclass.data
5+
46
sealed abstract class Color extends Product with Serializable
57

68
object Color {
79

8-
final case class RGBA(r: Int, g: Int, b: Int, alpha: Double) extends Color
10+
@data class RGBA(r: Int, g: Int, b: Int, alpha: Double) extends Color
911

10-
final case class StringColor(color: String) extends Color
12+
@data class StringColor(color: String) extends Color
1113

1214
object StringColor {
1315
val colors = Set(
@@ -23,7 +25,7 @@ object Color {
2325
)
2426
}
2527

26-
final case class RGB(r: Int, g: Int, b: Int) extends Color
28+
@data class RGB(r: Int, g: Int, b: Int) extends Color
2729

28-
final case class HSL(h: Int, s: Int, l: Int) extends Color
30+
@data class HSL(h: Int, s: Int, l: Int) extends Color
2931
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
package plotly.element
22

3-
final case class Cumulative(enabled: Boolean)
3+
import dataclass.data
4+
5+
@data class Cumulative(enabled: Boolean)

core/shared/src/main/scala/plotly/element/Error.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package plotly
22
package element
33

4+
import dataclass.data
5+
46
import java.lang.{ Boolean => JBoolean, Double => JDouble }
57

68
sealed abstract class Error(val `type`: String) extends Product with Serializable
79

810
object Error {
9-
case class Data(
11+
@data class Data(
1012
array: Seq[Double],
1113
visible: Option[Boolean],
1214
symmetric: Option[Boolean],
@@ -28,7 +30,7 @@ object Error {
2830
)
2931
}
3032

31-
case class Percent(
33+
@data class Percent(
3234
value: Double,
3335
visible: Option[Boolean],
3436
symmetric: Option[Boolean],
@@ -50,7 +52,7 @@ object Error {
5052
)
5153
}
5254

53-
case class Constant(
55+
@data class Constant(
5456
value: Double,
5557
color: Option[String],
5658
thickness: Option[Double],

core/shared/src/main/scala/plotly/element/Line.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package plotly
22
package element
33

4+
import dataclass.data
5+
46
import java.lang.{ Double => JDouble }
57

6-
final case class Line(
8+
@data class Line(
79
shape: Option[LineShape],
810
color: Option[OneOrSeq[Color]],
911
width: Option[OneOrSeq[Double]],

core/shared/src/main/scala/plotly/element/LocalDateTime.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package plotly.element
22

3+
import dataclass.data
4+
35
import scala.util.Try
46

5-
case class LocalDateTime(
7+
@data class LocalDateTime(
68
year: Int,
79
month: Int,
810
dayOfMonth: Int,

core/shared/src/main/scala/plotly/element/Marker.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package element
33

44
import java.lang.{ Double => JDouble }
55

6-
final case class Marker(
6+
import dataclass.data
7+
8+
@data class Marker(
79
size: Option[OneOrSeq[Int]],
810
color: Option[OneOrSeq[Color]],
911
opacity: Option[OneOrSeq[Double]],

core/shared/src/main/scala/plotly/element/ScatterMode.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package plotly
22
package element
33

4-
case class ScatterMode(flags: Set[ScatterMode.Flag])
4+
import dataclass.data
5+
6+
@data class ScatterMode(flags: Set[ScatterMode.Flag])
57

68
object ScatterMode {
79
def apply(flags: Flag*): ScatterMode =

core/shared/src/main/scala/plotly/element/Symbol.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package plotly
22
package element
3+
import dataclass.data
34

45
sealed abstract class Symbol(label0: String, idx0: Int) extends Product with Serializable {
56
def idx: Int = idx0 + (if (open) 100 else 0)
@@ -14,10 +15,10 @@ object Symbol {
1415
def dot: Boolean
1516
}
1617

17-
case class Circle(open: Boolean = false, dot: Boolean = false) extends DotSymbol("circle", 0)
18-
case class Square(open: Boolean = false, dot: Boolean = false) extends DotSymbol("square", 1)
19-
case class Diamond(open: Boolean = false, dot: Boolean = false) extends DotSymbol("diamond", 2)
20-
case class Cross(open: Boolean = false, dot: Boolean = false) extends DotSymbol("cross", 3)
18+
@data class Circle(open: Boolean = false, dot: Boolean = false) extends DotSymbol("circle", 0)
19+
@data class Square(open: Boolean = false, dot: Boolean = false) extends DotSymbol("square", 1)
20+
@data class Diamond(open: Boolean = false, dot: Boolean = false) extends DotSymbol("diamond", 2)
21+
@data class Cross(open: Boolean = false, dot: Boolean = false) extends DotSymbol("cross", 3)
2122

2223
/*
2324
"4" | "x" | "104" | "x-open" | "204" | "x-dot" | "304" | "x-open-dot"
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
package plotly
22
package element
33

4-
final case class TextFont(family: String)
4+
import dataclass.data
5+
6+
@data class TextFont(family: String)

core/shared/src/main/scala/plotly/layout/Annotation.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package layout
33

44
import java.lang.{ Boolean => JBoolean }
55

6+
import dataclass.data
67
import plotly.element._
78

8-
final case class Annotation(
9+
@data class Annotation(
910
xref: Option[Ref],
1011
yref: Option[Ref],
1112
x: Option[Element],

core/shared/src/main/scala/plotly/layout/Axis.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package layout
33

44
import java.lang.{ Integer => JInt, Double => JDouble, Boolean => JBoolean }
55

6+
import dataclass.data
67
import plotly.element._
78

8-
final case class Axis(
9+
@data class Axis(
910
title: Option[String],
1011
titlefont: Option[Font],
1112
showgrid: Option[Boolean],

core/shared/src/main/scala/plotly/layout/Font.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ package layout
44
import plotly.element._
55

66
import java.lang.{ Integer => JInt }
7+
import dataclass.data
78

8-
final case class Font(
9+
@data class Font(
910
size: Option[Int],
1011
family: Option[String],
1112
color: Option[Color]

core/shared/src/main/scala/plotly/layout/Layout.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ package layout
44
import java.lang.{ Integer => JInt, Double => JDouble, Boolean => JBoolean }
55

66
import plotly.element._
7+
import dataclass.data
78

8-
final case class Layout(
9+
@data class Layout(
910
title: Option[String],
1011
legend: Option[Legend],
1112
width: Option[Int],

core/shared/src/main/scala/plotly/layout/Legend.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ package layout
44
import java.lang.{ Double => JDouble }
55

66
import plotly.element._
7+
import dataclass.data
78

8-
final case class Legend(
9+
@data class Legend(
910
x: Option[Double],
1011
y: Option[Double],
1112
traceorder: Option[TraceOrder],

core/shared/src/main/scala/plotly/layout/Margin.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package plotly
22
package layout
33

44
import java.lang.{ Integer => JInt, Boolean => JBoolean }
5+
import dataclass.data
56

6-
final case class Margin(
7+
@data class Margin(
78
autoexpand: Option[Boolean],
89
l: Option[Int],
910
r: Option[Int],

demo/src/main/scala/plotly/demo/Demo.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import plotly.Plotly
66

77
import org.scalajs.dom
88

9-
import scalatags.JsDom.all._
9+
import scalatags.JsDom.all.{area => _, _}
1010

1111
@JSExport object Demo {
1212

project/Deps.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ object Deps {
99

1010
def almondScalaApi = "sh.almond" %% "jupyter-api" % "0.8.2"
1111
def argonautShapeless = setting("com.github.alexarchambault" %%% "argonaut-shapeless_6.2" % "1.2.0-M11")
12+
def dataClass = "io.github.alexarchambault" %% "data-class" % "0.2.0"
1213
def jodaTime = "joda-time" % "joda-time" % "2.10.4"
1314
def rhino = "org.mozilla" % "rhino" % "1.7.11"
1415
def shapeless = setting("com.chuusai" %%% "shapeless" % "2.3.3")

project/Settings.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,27 @@ object Settings {
9090
private val scala212 = "2.12.10"
9191
private val scala213 = "2.13.1"
9292

93+
private lazy val isAtLeastScala213 = Def.setting {
94+
import Ordering.Implicits._
95+
CrossVersion.partialVersion(scalaVersion.value).exists(_ >= (2, 13))
96+
}
97+
9398
lazy val shared = Seq(
9499
crossScalaVersions := Seq(scala213, scala212),
95100
scalaVersion := scala213,
96101
resolvers ++= Seq(
97102
"Webjars Bintray" at "https://dl.bintray.com/webjars/maven/",
98103
Resolver.sonatypeRepo("releases"),
99104
"jitpack" at "https://jitpack.io"
100-
)
105+
),
106+
libraryDependencies ++= {
107+
if (isAtLeastScala213.value) Nil
108+
else Seq(compilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full))
109+
},
110+
scalacOptions ++= {
111+
if (isAtLeastScala213.value) Seq("-Ymacro-annotations")
112+
else Nil
113+
}
101114
)
102115

103116
lazy val dontPublish = Seq(

0 commit comments

Comments
 (0)