Skip to content

Commit 60c2b28

Browse files
Merge pull request #226 from alexarchambault/develop
Add candlestick chart, plus maintainance
2 parents 0ceb862 + bf977c4 commit 60c2b28

File tree

14 files changed

+121
-20
lines changed

14 files changed

+121
-20
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
target/
2+
.bsp/

build.sbt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ lazy val core = crossProject(JVMPlatform, JSPlatform)
3030
libraryDependencies += Deps.dataClass % Provided
3131
)
3232
.jvmSettings(
33-
compatibilitySettings
33+
compatibilitySettings,
34+
mimaPreviousArtifacts := mimaPreviousArtifacts.value
35+
.filter(!_.revision.startsWith("0.7."))
3436
)
3537

3638
lazy val coreJvm = core.jvm
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package plotly
2+
3+
import plotly.element.LocalDateTime
4+
5+
import scala.language.implicitConversions
6+
7+
sealed abstract class Range extends Product with Serializable
8+
9+
object Range {
10+
final case class Doubles(range: (Double, Double)) extends Range
11+
final case class DateTimes(range: (LocalDateTime, LocalDateTime)) extends Range
12+
13+
implicit def fromDoubleTuple(t: (Double, Double)): Range =
14+
Doubles(t)
15+
implicit def fromDateTimes(t: (LocalDateTime, LocalDateTime)): Range =
16+
DateTimes(t)
17+
}

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

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ object Bar {
200200
Option(xaxis),
201201
Option(yaxis),
202202
Option(error_y),
203-
Option(showlegend).map(b => b: Boolean),
203+
Option(showlegend) .map(b => b: Boolean),
204204
Option(hoverinfo),
205205
Option(textposition),
206-
Option(opacity).map(d => d: Double),
206+
Option(opacity) .map(d => d: Double),
207207
Option(width),
208208
Option(base)
209209
)
@@ -316,9 +316,50 @@ object Heatmap {
316316
Option(y),
317317
Option(x),
318318
Option(z),
319-
Option(autocolorscale).map(b => b: Boolean),
319+
Option(autocolorscale) .map(b => b: Boolean),
320320
Option(colorscale),
321-
Option(showscale).map(b => b: Boolean),
321+
Option(showscale) .map(b => b: Boolean),
322322
Option(name)
323323
)
324324
}
325+
326+
@data(optionSetters = true) class Candlestick(
327+
x: Option[Sequence] = None,
328+
close: Option[Sequence] = None,
329+
high: Option[Sequence] = None,
330+
low: Option[Sequence] = None,
331+
open: Option[Sequence] = None,
332+
decreasing: Option[Marker] = None,
333+
increasing: Option[Marker] = None,
334+
line: Option[Marker] = None,
335+
xaxis: Option[AxisReference] = None,
336+
yaxis: Option[AxisReference] = None
337+
) extends Trace
338+
339+
object Candlestick {
340+
@deprecated("Use Candlestick() and chain-call .with* methods on it instead", "0.8.0")
341+
def apply(
342+
x: Sequence = null,
343+
close: Sequence = null,
344+
high: Sequence = null,
345+
low: Sequence = null,
346+
open: Sequence = null,
347+
decreasing: Marker = null,
348+
increasing: Marker = null,
349+
line: Marker = null,
350+
xaxis: AxisReference = null,
351+
yaxis: AxisReference = null
352+
): Candlestick =
353+
Candlestick(
354+
Option(x),
355+
Option(close),
356+
Option(high),
357+
Option(low),
358+
Option(open),
359+
Option(decreasing),
360+
Option(increasing),
361+
Option(line),
362+
Option(xaxis),
363+
Option(yaxis)
364+
)
365+
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ object Color {
2121
"blue",
2222
"cls", // ???
2323
"pink",
24-
"green"
24+
"green",
25+
"magenta"
2526
)
2627
}
2728

2829
@data class RGB(r: Int, g: Int, b: Int) extends Color
2930

3031
@data class HSL(h: Int, s: Int, l: Int) extends Color
31-
}
32+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ object LocalDateTime extends PlotlyJavaTimeConversions {
3030
(d.split('-'), t.split(':')) match {
3131
case (Array(IntStr(y), IntStr(m), IntStr(d)), Array(IntStr(h), IntStr(min), IntStr(s))) =>
3232
Some(LocalDateTime(y, m, d, h, min, s))
33+
case (Array(IntStr(y), IntStr(m), IntStr(d)), Array(IntStr(h), IntStr(min))) =>
34+
Some(LocalDateTime(y, m, d, h, min, 0))
3335
case _ => None
3436
}
3537
case _ => None

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package plotly
22
package layout
33

4-
import java.lang.{ Boolean => JBoolean }
4+
import java.lang.{ Boolean => JBoolean, Double => JDouble }
55

66
import dataclass.data
77
import plotly.element._
@@ -15,7 +15,10 @@ import plotly.element._
1515
yanchor: Option[Anchor] = None,
1616
text: Option[Element] = None,
1717
font: Option[Font] = None,
18-
showarrow: Option[Boolean] = None
18+
showarrow: Option[Boolean] = None,
19+
@since("0.8.0")
20+
ax: Option[Double] = None,
21+
ay: Option[Double] = None
1922
)
2023

2124
object Annotation {

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ import plotly.element._
2828
zeroline: Option[Boolean] = None,
2929
zerolinewidth: Option[Double] = None,
3030
zerolinecolor: Option[Color] = None,
31-
range: Option[(Double, Double)] = None,
31+
range: Option[Range] = None,
3232
autorange: Option[Boolean] = None,
3333
ticks: Option[Ticks] = None,
34-
domain: Option[(Double, Double)] = None,
34+
domain: Option[Range] = None,
3535
side: Option[Side] = None,
3636
anchor: Option[AxisAnchor] = None,
3737
`type`: Option[AxisType] = None,
@@ -41,7 +41,9 @@ import plotly.element._
4141
tickvals: Option[Sequence] = None,
4242
ticktext: Option[Sequence] = None,
4343
nticks: Option[Int] = None,
44-
automargin: Option[Boolean] = None
44+
automargin: Option[Boolean] = None,
45+
@since("0.8.0")
46+
rangeslider: Option[RangeSlider] = None
4547
)
4648

4749
object Axis {
@@ -105,10 +107,10 @@ object Axis {
105107
Option(zeroline) .map(x => x: Boolean),
106108
Option(zerolinewidth) .map(x => x: Double),
107109
Option(zerolinecolor),
108-
Option(range),
110+
Option(range) .map(x => x: Range),
109111
Option(autorange) .map(x => x: Boolean),
110112
Option(ticks),
111-
Option(domain),
113+
Option(domain) .map(x => x: Range),
112114
Option(side),
113115
Option(anchor),
114116
Option(`type`),

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ import plotly.element._
3333
bargroupgap: Option[Double] = None,
3434
hovermode: Option[HoverMode] = None,
3535
boxmode: Option[BoxMode] = None,
36-
scene: Option[Scene] = None
37-
36+
scene: Option[Scene] = None,
37+
@since("0.8.0")
38+
dragmode: Option[String] = None,
39+
shapes: Option[Seq[Shape]] = None
3840
)
3941

4042
object Layout {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package plotly.layout
2+
3+
import dataclass.data
4+
import plotly.Range
5+
6+
@data(optionSetters = true) class RangeSlider(
7+
range: Option[Range] = None
8+
)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package plotly.layout
2+
3+
import dataclass.data
4+
import plotly.element.{Color, Line}
5+
6+
@data(optionSetters = true) class Shape (
7+
`type`: Option[String] = None,
8+
xref: Option[String] = None,
9+
yref: Option[String] = None,
10+
x0: Option[String] = None,
11+
y0: Option[Double] = None,
12+
x1: Option[String] = None,
13+
y1: Option[Double] = None,
14+
fillcolor: Option[Color] = None,
15+
opacity: Option[Double] = None,
16+
line: Option[Line] = None
17+
)

project/plugins.sbt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.3")
2-
addSbtPlugin(("io.github.alexarchambault.sbt" % "sbt-compatibility" % "0.0.8").exclude("com.typesafe", "sbt-mima-plugin"))
2+
addSbtPlugin("io.github.alexarchambault.sbt" % "sbt-compatibility" % "0.0.8")
33
addSbtPlugin("io.github.alexarchambault.sbt" % "sbt-eviction-rules" % "0.2.0")
4-
addSbtPlugin("com.github.alexarchambault.tmp" % "sbt-mima-plugin" % "0.7.1-SNAPSHOT")
4+
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.8.0")
55
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.3.0")
66
addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0")
77
addSbtPlugin("org.scala-js" % "sbt-jsdependencies" % "1.0.2")
88
addSbtPlugin("io.get-coursier" % "sbt-shading" % "2.0.0")
9-
10-
resolvers += Resolver.sonatypeRepo("snapshots")

render/shared/src/main/scala/plotly/internals/ArgonautCodecsInternals.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ object ArgonautCodecsInternals extends ArgonautCodecsExtra {
4949
implicit val sequenceNestedIntsIsWrapper: IsWrapper[Sequence.NestedInts] = null
5050
implicit val sequenceStringsIsWrapper: IsWrapper[Sequence.Strings] = null
5151
implicit val sequenceDatetimesIsWrapper: IsWrapper[Sequence.DateTimes] = null
52+
implicit val rangeDoublesIsWrapper: IsWrapper[Range.Doubles] = null
53+
implicit val rangeDatetimesIsWrapper: IsWrapper[Range.DateTimes] = null
5254
implicit val doubleElementIsWrapper: IsWrapper[Element.DoubleElement] = null
5355
implicit val stringElementIsWrapper: IsWrapper[Element.StringElement] = null
5456
implicit def oneOrSeqOneIsWrapper[T]: IsWrapper[OneOrSeq.One[T]] = null
@@ -408,6 +410,9 @@ object ArgonautCodecsInternals extends ArgonautCodecsExtra {
408410
implicit val sequenceJsonCodec: JsonSumCodecFor[Sequence] =
409411
JsonSumCodecFor(jsonSumDirectCodecFor("sequence"))
410412

413+
implicit val rangeJsonCodec: JsonSumCodecFor[Range] =
414+
JsonSumCodecFor(jsonSumDirectCodecFor("range"))
415+
411416
implicit val boxPointsJsonCodec: JsonSumCodecFor[BoxPoints] =
412417
JsonSumCodecFor(jsonSumDirectCodecFor("box points"))
413418

tests/src/test/scala/plotly/doc/DocumentationTests.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ class DocumentationTests extends AnyFlatSpec with Matchers {
229229
"basic/horizontal-bar",
230230
// TODO? Pie charts
231231
"financial/time-series",
232+
"financial/candlestick-charts",
233+
// "financial/ohlc",
232234
"basic/bubble",
233235
"basic/area",
234236
"layout/sizing",

0 commit comments

Comments
 (0)