Laughing-Man-Studios / Ski-Resort-Dashboard

A small dashboard to display some statistics about the local ski resorts I visit
MIT License
0 stars 0 forks source link

Update individual resort data format #105

Closed Rogibb111 closed 1 year ago

Rogibb111 commented 1 year ago

I need to update the way that individual resort data renders so I can effectively use it with the lit-graph library I created. This will mean separating out the different data point types and combing them with dates in the correct JSON array format.

Rogibb111 commented 1 year ago

Did a small example work through for this in Scastie:

import scala.collection.mutable.ArrayBuffer
final case class ResortData(dailySnow: Int, baseDepth: Int, temperature: Int, windSpeed: Int, windDir: String) 
final case class ResortDataSnapshot(timestamp: String, resortData: ResortData)
final case class DataPlot(timestamp: String, value: String | Int)
class GraphData () {
    val dailySnow = ArrayBuffer[DataPlot]()
    val baseDepth = ArrayBuffer[DataPlot]()
    val temperature = ArrayBuffer[DataPlot]()
    val windSpeed = ArrayBuffer[DataPlot]()
    val windDir = ArrayBuffer[DataPlot]()

    def addPlotsFromSnapshot(snapshot: ResortDataSnapshot): Unit = {
    dailySnow += new DataPlot(snapshot.timestamp, snapshot.resortData.dailySnow)
    baseDepth += new DataPlot(snapshot.timestamp, snapshot.resortData.baseDepth)
    temperature += new DataPlot(snapshot.timestamp, snapshot.resortData.temperature)
    windSpeed += new DataPlot(snapshot.timestamp, snapshot.resortData.windSpeed)
    windDir += new DataPlot(snapshot.timestamp, snapshot.resortData.windDir)
  }
}

val data1 = new ResortData(2, 4, 5, 4, "North")
val data2 = new ResortData(1, 3, 4, 3, "South")
val data3 = new ResortData(1, 3, 4, 4, "West")

val dataSnap1 = new ResortDataSnapshot("time1", data1);
val dataSnap2 = new ResortDataSnapshot("time2", data2);
val dataSnap3 = new ResortDataSnapshot("time3", data3);

val dataArr = Array(dataSnap1, dataSnap2, dataSnap3)

dataArr.map(data => println(data)) 
val graphData = new GraphData()

for
    snapshot <- dataArr
do
    graphData.addPlotsFromSnapshot(snapshot)

for
    data <- graphData.dailySnow 
do
    println(data)
Rogibb111 commented 1 year ago

Above code sample only works for scala3. This should work for scala 2:

import scala.collection.mutable.ArrayBuffer
final case class ResortData(dailySnow: Int, baseDepth: Int, temperature: Int, windSpeed: Int, windDir: String) 
final case class ResortDataSnapshot(timestamp: String, resortData: ResortData)
final case class DataPlot(timestamp: String, value: Any)
class GraphData () {
    val dailySnow = ArrayBuffer[DataPlot]()
    val baseDepth = ArrayBuffer[DataPlot]()
    val temperature = ArrayBuffer[DataPlot]()
    val windSpeed = ArrayBuffer[DataPlot]()
    val windDir = ArrayBuffer[DataPlot]()

    def addPlotsFromSnapshot(snapshot: ResortDataSnapshot): Unit = {
    dailySnow += new DataPlot(snapshot.timestamp, snapshot.resortData.dailySnow)
    baseDepth += new DataPlot(snapshot.timestamp, snapshot.resortData.baseDepth)
    temperature += new DataPlot(snapshot.timestamp, snapshot.resortData.temperature)
    windSpeed += new DataPlot(snapshot.timestamp, snapshot.resortData.windSpeed)
    windDir += new DataPlot(snapshot.timestamp, snapshot.resortData.windDir)
  }
}

val data1 = new ResortData(2, 4, 5, 4, "North")
val data2 = new ResortData(1, 3, 4, 3, "South")
val data3 = new ResortData(1, 3, 4, 4, "West")

val dataSnap1 = new ResortDataSnapshot("time1", data1);
val dataSnap2 = new ResortDataSnapshot("time2", data2);
val dataSnap3 = new ResortDataSnapshot("time3", data3);

val dataArr = Array(dataSnap1, dataSnap2, dataSnap3)

dataArr.map(data => println(data)) 
val graphData = new GraphData()

for (snapshot <- dataArr) {
    graphData.addPlotsFromSnapshot(snapshot)
}

for (data <- graphData.dailySnow) {
  println(data)
}
Rogibb111 commented 1 year ago

Needed a way to generate a JSON list of timestamps and values. Came up with a DataPlot case class that will take in either an Int or a String. Example below turns the class into a Json Object

import play.api.libs.json.JsValue
import scala.collection.mutable.ArrayBuffer;
import play.api.libs.json.Json
import play.api.libs.json.Writes
import play.api.libs.json.JsValue
import play.api.libs.json.JsString
import play.api.libs.json.JsNumber

final case class DataPlot(timestamp: String, value: Either[String, Int]) {
  implicit val valWrites = new Writes[Either[String, Int]] {
    def writes(o: Either[String,Int]): JsValue = o.fold(
      l => JsString(l),
      r => JsNumber(r)
    )
  } 
  implicit val writes = Json.writes[DataPlot]

  def toJson(): String = {
    return Json.toJson(this).toString()
  }

}

val data = new DataPlot("hey", Left("you"))

print(data.toJson())
Rogibb111 commented 1 year ago

:tada: This issue has been resolved in version 1.5.0 :tada:

The release is available on GitHub release

Your semantic-release bot :package::rocket: