Coder Social home page Coder Social logo

sbt-tzdb's Introduction

sbt-tzdb

Build a custom time zone database for Scala.js and Scala Native applications.

sbt-tzdb is a code generation tool used to build a time zone db compatible with the Scala.js and Scala Native side of scala-java-time.

Its main purpose is to let users build a custom version of tzdb, which has the minimal data your application needs reducing the size of the application. This is fairly important for Scala.js applications.

What does it do?

The plugin will download a time zone data package from IANA TimeZone Database, then it will parse the database and build suitable code that scala-java-time can use to support the timezone base operations.

This should only happen once on your build. If you need to regenerate the db, e.g. if the version has changed or your filter is different, just clean your project

Why?

The full timezone databes is fairly large containing historical records for all time zones. A typical application doesn't need so many timezones, however the full database must be carried due to the properties of the java.time API, which search timezones with strings. This doesn't let the Scala.js optimizer remove unnecessary zones.

However, it is legal to have a smaller database with only the time zones of your interest. As it is impossible to publish all possible combinations, this plugin lets you generate dynamically the database for your application.

By restricting the available timezones you can reduce your js size up to several megabytes on fastOptJS.

Usage Instructions

add the plugin dependency to project/plugins.sbt for sbt 1.1.x

addSbtPlugin("io.github.cquiroz" % "sbt-tzdb" % "4.2.0") // Or latest version; check release tags

The plugin currently supports sbt 1.1.x.

The you need to enable the plugin in your project e.g.:

  .enablePlugins(TzdbPlugin)

Note that the plugin should be only enabled for js projects but it is not enforced. For cross projects you should do:

lazy val lib = crossProject(JVMPlatform, JSPlatform, NativePlatform)
  ...

lazy val libJVM = lib.jvm
lazy val libJS  = lib.js.enablePlugins(TzdbPlugin)
lazy val libNative  = lib.native.enablePlugins(TzdbPlugin)

This only makes sense if you add scala-java-time as a dependency

libraryDependencies ++= Seq(
  "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" // Or latest version; check projects release tags
)

If you want TZDB to be in multiple cross projects then include the plugin in a parent one which the other projects depend upon otherwise you may encounter intermittent compilation issues.

  // we have created the "modules/tzdb" directory inside the project but this is up to how you want to 
  // organize the modules of your project
  lazy val libTzdb = crossProject(JVMPlatform, JSPlatform)
      .in(file("modules/tzdb"))
      .settings(
        name := "tzdb",
        dbVersion := TzdbPlugin.Version("2024a")
      )
      .jsConfigure(
        _.enablePlugins(TzdbPlugin)
      )

  lazy val libClient = crossProject(JVMPlatform, JSPlatform)
        .dependsOn(libTzdb.js)

Main Tasks

The plugin attaches to the build and adds a custom code generation task which will build a compatible timezone

Configuration settings

  • dbVersion: Lets you specify what tzdb version you want to use. It defaults to latest
  • zonesFilter: A function to filter what timezones are included. By default all zones are included but to reduce the size you should specify only the ones you need, e.g.:
zonesFilter := {(z: String) => z == "America/Santiago" || z == "Pacific/Honolulu"},

Warning

  • This is still an experimental plugin, use with care

sbt-tzdb's People

Contributors

an-tex avatar armanbilge avatar cquiroz avatar dependabot[bot] avatar fthomas avatar jamesmcintosh avatar lasering avatar matthughes avatar mergify[bot] avatar povder avatar rpiaggio avatar scala-steward avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

sbt-tzdb's Issues

Compilation error "not found: type ZoneMap"

Hi,

I'm using Scala 2.12.7, scala.js 0.6.25 and sbt 1.2.6.

I've just added the plugin to my plugins.sbt as follows:

addSbtPlugin("io.github.cquiroz" % "sbt-tzdb" % "0.3.0")

.. and added the plugin to my client projects, as well as configured it, as follows:

lazy val client1 = project.in(file("client1")).enablePlugins(TzdbPlugin)
    .settings(zonesFilter := {(z: String) => z == "Europe/London"}

lazy val client2 = project.in(file("client2")).enablePlugins(TzdbPlugin)
    .settings(zonesFilter := {(z: String) => z == "Europe/London"}

lazy val client3 = project.in(file("client3")).enablePlugins(TzdbPlugin)
    .settings(zonesFilter := {(z: String) => z == "Europe/London"}

lazy val shared = crossProject(JVMPlatform, JSPlatform)
    .jsConfigure(_.enablePlugins(TzdbPlugin))
    .settings(zonesFilter := {(z: String) => z == "Europe/London"}

lazy val sharedJvm = shared.jvm
lazy val sharedJs = shared.js

(Note: the above configuration is simplified; I have other plugins enabled as well - e.g. ScalaJSPlugin, ScalaJSWeb, JSDependenciesPlugin, ScalaJSBundlerPlugin)

When compiling the project, I get the following output:

sbt:client1> compile
[info] tzdb data missing. downloading latest version to (...)\client1\target\scala-2.12\resource_managed\main\tzdb...
[info] downloading from http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
[info] to file (...)\client1\target\scala-2.12\resource_managed\main\tzdb.tar.gz
[info] Updating ...
[info] Done updating.
[warn] There may be incompatibilities among your library dependencies.
[warn] Run 'evicted' to see detailed eviction warnings
[info] Compiling 5 Scala sources to (...)\shared\.js\target\scala-2.12\classes ...
[error] (...)\shared\.js\target\scala-2.12\src_managed\main\java\time\zone\TzdbZoneRulesProvider.scala:110:21: not found: type ZoneMap
[error]         val r = new ZoneMap[String, ZoneRules]
[error]                     ^
[error] one error found
[info] Generating tzdb from db at (...)\client1\target\scala-2.12\resource_managed\main\tzdb to (...)\client1\target\scala-2.12\src_managed\main
[error] (sharedJS / Compile / compileIncremental) Compilation failed
[error] Total time: 6 s, completed 25.11.2018. 21:53:18
sbt:client1>    

Any idea what am I doing wrong? Thanks.

Compilation fails when source is generated with spread operator

We have been having intermittent issues with the tzdb plugin where it generates the tzdb_java.scala using the spread operator.

Seems it might be related to:
cquiroz/scala-java-time#66

[error] /opt/atlassian/pipelines/agent/build/scala/application/admin/target/scala-2.12/src_managed/main/tzdb/tzdb_java.scala:174:346: illegal start of simple expression                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ^
[error]     val America_Puerto_Rico: scala.scalajs.js.Dynamic = js.Dynamic.literal(("s", -15865), ("w", -15865), ("t", scala.scalajs.js.Array[scala.scalajs.js.Array[Int]](scala.scalajs.js.Array[Int](1899087, 43200, -15865, -14400))), ("l", scala.scalajs.js.Array[scala.scalajs.js.Array[Int]](scala.scalajs.js.Array[Int](1899087, 43200, -15865, -14400), ...(1942123, 0, -14400, -10800), scala.scalajs.js.Array[Int](1945273, 7200, -10800, -14400))), ("r", ...()))
[error]                                                                                                                                                                                                                                                                                                                                                          ^
[error] /opt/atlassian/pipelines/agent/build/scala/application/admin/target/scala-2.12/src_managed/main/tzdb/tzdb_java.scala:175:3: ')' expected but '}' found.
[error]   }

The spread operator is some times even being referenced as the val type.

 val Asia_Qostanay: ... = js.Dynamic.literal(("s", 15268), ("w", 15268), ("t", ...(scala.scalajs.js.Array[Int](1924123, 0, 15268, 14400)

When there is no spread operator it compiles correctly.

    val America_Puerto_Rico: scala.scalajs.js.Dynamic = js.Dynamic.literal(("s", -15865), ("w", -15865), ("t", scala.scalajs.js.Array[scala.scalajs.js.Array[Int]](scala.scalajs.js.Array[Int](1899087, 43200, -15865, -14400))), ("l", scala.scalajs.js.Array[scala.scalajs.js.Array[Int]](scala.scalajs.js.Array[Int](1899087, 43200, -15865, -14400), scala.scalajs.js.Array[Int](1942123, 0, -14400, -10800), scala.scalajs.js.Array[Int](1945273, 7200, -10800, -14400))), ("r", scala.scalajs.js.Array[scala.scalajs.js.Array[Int]]()))

Our build environment is

JDK 11
val scalaVersion = "2.12.12"
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0")
addSbtPlugin("io.github.cquiroz" % "sbt-tzdb" % "3.0.0")

I have also tried with an older scala-js 1.3.0.

"Generating tzdb..." occurs on every build

Hi, according to the docs, the tzdb should only be generated once: "This should only happen once on your build"

However, whenever I do a sbt compile, I get the following message for each of my subprojects:

[info] Generating tzdb from db at (... local file path ...)\target\scala-2.13\resource_managed\main\tzdb to (... local file path ...)\target\scala-2.13\src_managed\main

The process adds approx. 2 seconds per compile. Can this be eliminated somehow, or am I misunderstanding how the plugin works?

I am using SBT 1.5.1, Scala 2.13.5, Scala.js 1.5.1, sbt-tzdb 1.0.1, scala-java-time 2.2.2, AdoptOpenJDK 15 on Windows 10.

Thanks!

Add support for Scala 3.0.0

I have a Scala 3.0.0 project with very strict compiler flags:

scalacOptions ++= Seq(
    "-indent",                       // Allow significant indentation.
    "-new-syntax",                   // Require `then` and `do` in control expressions.
    "-feature",                      // Emit warning and location for usages of features that should be imported explicitly.
    "-language:future",              // better-monadic-for
    "-language:implicitConversions", // Allow implicit conversions
    "-deprecation",                  // Emit warning and location for usages of deprecated APIs.
    "-Werror",                       // Fail the compilation if there are any warnings.
    "-source:future",
    (...)
)

The generated sources namely the TzdbZoneRulesProvider is causing errors such as:

[error] -- Error: /home/simon/Documents/SimulaEV/modules/frontend/target/scala-3.1.1/src_managed/main/java/time/zone/TzdbZoneRulesProvider.scala:16:26 
[error] 16 |  import zonedb.java.tzdb._
[error]    |                          ^
[error]    |`_` is no longer supported for a wildcard import; use `*` instead
[error]    |This construct can be rewritten automatically under -rewrite -source future-migration.
[error] -- Error: /home/simon/Documents/SimulaEV/modules/frontend/target/scala-3.1.1/src_managed/main/java/time/zone/TzdbZoneRulesProvider.scala:54:23 
[error] 54 |    val dayOfWeek = if (zor(2) >= 0) DayOfWeek.of(zor(2)) else null
[error]    |                       ^^^^^^^^^^^^^
[error]    |This construct is not allowed under -new-syntax.
[error]    |This construct can be rewritten automatically under -new-syntax -rewrite -source 3.0-migration.

Any suggestion on how to fix it? I see the code is generated via a sourceGenerators, maybe its possible to add another sourceGenerator that would recompile with -new-syntax -rewrite -future-migration (if that is even something sbt will allow).

PS: I'm trying to avoid following the suggestion of creating a subproject just for this as it would complicate my setup a lot.

Better Files Issue

I'm not sure why, but upgrading sbt-tzdb from 0.3.2 to 0.4.0 causes BetterFiles issues on my Play App. This is the only change I did on my build. I'm also using BetterFiles 0.3.8 so I can't think why there would be any conflict (not to mention this is a plug-in). Just reporting in case others sees it as well. I'm rolling back to 0.3.2 in the mean time.

This is the error I've seen:

Uncaught error from thread [play-dev-mode-akka.actor.default-dispatcher-2]: better.files.package$.FileOps(Ljava/io/File;)Lbetter/files/Implicits$FileOps;, shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[play-dev-mode]
java.lang.NoSuchMethodError: better.files.package$.FileOps(Ljava/io/File;)Lbetter/files/Implicits$FileOps;
        at play.runsupport.Reloader.$anonfun$reload$3(Reloader.scala:513)
        at scala.collection.Iterator$$anon$11.nextCur(Iterator.scala:484)
        at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:490)
        at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:458)
        at scala.collection.Iterator.foreach(Iterator.scala:941)
        at scala.collection.Iterator.foreach$(Iterator.scala:941)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
        at scala.collection.TraversableOnce.foldLeft(TraversableOnce.scala:162)
        at scala.collection.TraversableOnce.foldLeft$(TraversableOnce.scala:160)
        at scala.collection.AbstractIterator.foldLeft(Iterator.scala:1429)
        at play.runsupport.Reloader.$anonfun$reload$1(Reloader.scala:515)
        at play.runsupport.Reloader$$anon$1.run(Reloader.scala:58)
        at java.security.AccessController.doPrivileged(Native Method)
        at play.runsupport.Reloader$.play$runsupport$Reloader$$withReloaderContextClassLoader(Reloader.scala:64)
        at play.runsupport.Reloader.reload(Reloader.scala:501)
        at play.core.server.DevServerStart$$anon$1.get(DevServerStart.scala:143)
        at play.core.server.DevServerStart$.$anonfun$mainDev$2(DevServerStart.scala:258)
        at akka.actor.CoordinatedShutdown.$anonfun$run$3(CoordinatedShutdown.scala:487)
        at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:238)
        at scala.collection.Iterator.foreach(Iterator.scala:941)
        at scala.collection.Iterator.foreach$(Iterator.scala:941)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
        at scala.collection.IterableLike.foreach(IterableLike.scala:74)
        at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
        at scala.collection.TraversableLike.map(TraversableLike.scala:238)
        at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
        at scala.collection.AbstractTraversable.map(Traversable.scala:108)
        at akka.actor.CoordinatedShutdown.loop$1(CoordinatedShutdown.scala:484)
        at akka.actor.CoordinatedShutdown.$anonfun$run$6(CoordinatedShutdown.scala:530)
        at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:307)
        at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
        at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
        at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
        at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:92)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85)
        at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:92)
        at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)
        at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:49)
        at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Fatal signal Segmentation fault caught in jsoniter-scala's unit tests when linking with `nativeLTO := "thin"`

[error] Fatal signal Segmentation fault caught
[error]   at scala.scalanative.testinterface.signalhandling.SignalConfig$.asyncSafePrintStackTrace(Unknown Source)
[error]   at <none>._SM70scala.scalanative.testinterface.signalhandling.SignalConfig$$$Lambda$1G17$extern$forwarder(Unknown Source)
[error]   at scala.scalanative.runtime.package$.throwClassCast(Unknown Source)
[error]   at java.time.zone.StandardZoneRules$.apply(Unknown Source)
[error]   at zonedb.java.tzdb$eurlt$.Europe_Malta$lzycompute(Unknown Source)
[error]   at zonedb.java.tzdb$.stdZones$lzycompute(Unknown Source)
[error]   at java.time.zone.TzdbZoneRulesProvider.provideZoneIds(Unknown Source)
[error]   at java.time.zone.ZoneRulesProvider$.registerProvider0(Unknown Source)
[error]   at java.time.zone.ZoneRulesProvider$.registerProvider(Unknown Source)
[error]   at java.time.zone.ServiceLoaderZoneRulesInitializer$$Lambda$3.apply(Unknown Source)
[error]   at java.time.zone.ServiceLoaderZoneRulesInitializer.initializeProviders(Unknown Source)
[error]   at java.time.zone.ZoneRulesInitializer$.initialize(Unknown Source)
[error]   at <none>._SM33java.time.zone.ZoneRulesProvider$G4load(Unknown Source)
[error]   at java.time.ZoneId$.getAvailableZoneIds(Unknown Source)
[error]   at com.github.plokhotnyuk.jsoniter_scala.core.GenUtils$.<init>(Unknown Source)
[error]   at <none>._SM52com.github.plokhotnyuk.jsoniter_scala.core.GenUtils$G4load(Unknown Source)
[error]   at com.github.plokhotnyuk.jsoniter_scala.core.JsonReaderSpec.$anonfun$new$25(Unknown Source)
[error]   at com.github.plokhotnyuk.jsoniter_scala.core.JsonReaderSpec$$Lambda$37.apply(Unknown Source)
[error]   at org.scalatest.OutcomeOf.outcomeOf(Unknown Source)
[error]   at org.scalatest.wordspec.AnyWordSpecLike$$anon$3.apply(Unknown Source)
[error]   at org.scalatest.SuperEngine.runTestImpl(Unknown Source)
[error]   at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Unknown Source)
[error]   at org.scalatest.SuperEngine$$Lambda$16.apply(Unknown Source)
[error]   at org.scalatest.SuperEngine.traverseSubNodes$1(Unknown Source)
[error]   at org.scalatest.SuperEngine.runTestsInBranch(Unknown Source)
[error]   at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Unknown Source)
[error]   at org.scalatest.SuperEngine$$Lambda$16.apply(Unknown Source)
[error]   at org.scalatest.SuperEngine.traverseSubNodes$1(Unknown Source)
[error]   at org.scalatest.SuperEngine.runTestsInBranch(Unknown Source)
[error]   at org.scalatest.SuperEngine.runTestsImpl(Unknown Source)
[error]   at org.scalatest.wordspec.AnyWordSpecLike.runTests(Unknown Source)
[error]   at org.scalatest.Suite.run(Unknown Source)
[error]   at org.scalatest.SuperEngine.runImpl(Unknown Source)
[error]   at org.scalatest.tools.TaskRunner.executionFuture(Unknown Source)
[error]   at org.scalatest.tools.TaskRunner.execute(Unknown Source)
[error]   at scala.scalanative.testinterface.TestAdapterBridge.$anonfun$executeFun$1(Unknown Source)
[error]   at scala.util.Try$.apply(Unknown Source)
[error]   at scala.scalanative.testinterface.common.RunMuxRPC.$anonfun$attach$2(Unknown Source)
[error]   at scala.concurrent.Future.$anonfun$flatMap$1(Unknown Source)
[error]   at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Unknown Source)
[error]   at scala.concurrent.impl.CallbackRunnable.run(Unknown Source)
[error]   at scala.scalanative.runtime.ExecutionContext$.loop(Unknown Source)
[error]   at scala.scalanative.runtime.package$.loop(Unknown Source)
[error]   at scala.scalanative.testinterface.NativeRPC.loop(Unknown Source)
[error]   at scala.scalanative.testinterface.TestMain$.main(Unknown Source)
[error]   at <none>.main(Unknown Source)
[error]   at <none>.__libc_start_main(Unknown Source)
[error]   at <none>._start(Unknown Source)
[error] Test runner interrupted by fatal signal 11
[warn] Force close java.lang.RuntimeException: Process /home/andriy/Projects/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core/native/target/scala-2.12/jsoniter-scala-core-test-out finished with non-zero value 139

Not working with TZDB version 2018f onwards

Hi @cquiroz !

After a clean I started getting the following error with the latest TZDB version (2018g), which also happens with 2018f. With 2018e it works fine.

[error] java.time.DateTimeException: Invalid value for HourOfDay (valid values 0 - 23): 25
[error]         at java.time.temporal.ValueRange.checkValidValue(ValueRange.java:311)
[error]         at java.time.temporal.ChronoField.checkValidValue(ChronoField.java:703)
[error]         at java.time.LocalTime.of(LocalTime.java:296)
[error]         at kuyfi.TZDBParser$.$anonfun$hourMinParserLT$1(TZDBParser.scala:118)
[error]         at atto.Parser$$anon$5.$anonfun$apply$5(Parser.scala:29)
[error]         at cats.Eval$.advance(Eval.scala:272)
[error]         at cats.Eval$.loop$1(Eval.scala:354)
[error]         at cats.Eval$.cats$Eval$$evaluate(Eval.scala:372)
[error]         at cats.Eval$Defer.value(Eval.scala:258)
[error]         at atto.ParserFunctions.parseOnly(Parser.scala:102)
[error]         at atto.ParserFunctions.parseOnly$(Parser.scala:99)
[error]         at atto.Parser$.parseOnly(Parser.scala:42)
[error]         at atto.syntax.ParserOps.parseOnly(ParserOps.scala:19)
[error]         at atto.syntax.ParserOps.parseOnly$(ParserOps.scala:18)
[error]         at atto.syntax.ToParserOps$$anon$1.parseOnly(ParserOps.scala:99)
[error]         at kuyfi.TZDBParser$.parseFile(TZDBParser.scala:256)
[error]         at kuyfi.TZDBParser$.$anonfun$parseAll$3(TZDBParser.scala:293)
[error]         at scala.collection.Iterator$$anon$10.next(Iterator.scala:457)
[error]         at scala.collection.Iterator.foreach(Iterator.scala:944)
[error]         at scala.collection.Iterator.foreach$(Iterator.scala:944)
[error]         at scala.collection.AbstractIterator.foreach(Iterator.scala:1432)
[error]         at scala.collection.generic.Growable.$plus$plus$eq(Growable.scala:59)
[error]         at scala.collection.generic.Growable.$plus$plus$eq$(Growable.scala:50)
[error]         at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:186)
[error]         at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:44)
[error]         at scala.collection.TraversableOnce.to(TraversableOnce.scala:310)
[error]         at scala.collection.TraversableOnce.to$(TraversableOnce.scala:308)
[error]         at scala.collection.AbstractIterator.to(Iterator.scala:1432)
[error]         at scala.collection.TraversableOnce.toList(TraversableOnce.scala:294)
[error]         at scala.collection.TraversableOnce.toList$(TraversableOnce.scala:294)
[error]         at scala.collection.AbstractIterator.toList(Iterator.scala:1432)
[error]         at kuyfi.TZDBParser$.$anonfun$parseAll$1(TZDBParser.scala:294)
[error]         at cats.effect.internals.IORunLoop$.step(IORunLoop.scala:167)
[error]         at cats.effect.IO.unsafeRunTimed(IO.scala:307)
[error]         at cats.effect.IO.unsafeRunSync(IO.scala:242)
[error]         at io.gitub.sbt.tzdb.TzdbPlugin$.tzdbCodeGenImpl(SbtTzdb.scala:79)
[error]         at io.gitub.sbt.tzdb.TzdbPlugin$.$anonfun$projectSettings$3(SbtTzdb.scala:60)
[error]         at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]         at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error]         at sbt.std.Transform$$anon$4.work(System.scala:67)
[error]         at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error]         at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error]         at sbt.Execute.work(Execute.scala:278)
[error]         at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error]         at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error]         at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error]         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[error]         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[error]         at java.lang.Thread.run(Thread.java:748)

Zone abbreviations not included in generated code

With the following configuration:

    zonesFilter := { (zone: String) => zone == "America/Vancouver" || zone == "UTC" || zone == "GMT" },
    dbVersion := TzdbPlugin.Version("2021e"),
    tzdbPlatform := TzdbPlugin.Platform.Js

The following code is generated:

object tzdb {
  lazy val version: String = "2021e"
  object ameve {
    val America_Vancouver: scala.scalajs.js.Dynamic = js.Dynamic.literal //..... removed
  }
  lazy val fixedZones: scala.scalajs.js.Dynamic = js.Dynamic.literal(("Etc/UTC", 0), ("Etc/GMT", 0))
  lazy val stdZones: scala.scalajs.js.Dynamic = js.Dynamic.literal(("America/Vancouver", ameve.America_Vancouver))
  lazy val zoneLinks: Map[String, String] = Map(("UTC", "Etc/UTC"), ("GMT", "Etc/GMT"))
}

The generated code doesn't contain any zone abbreviations for America/Vancouver (PST, PDT). The same thing happens for other zones such as Europe/Berlin. The result of that is that when formatting a ZonedDateTime on Scala.JS a null is appended in the place where the zone abbreviation should be put.

val fmt = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.FULL).withLocale(Locale.forLanguageTag("en-CA"))
val str = fmt.format(Instant.now().atZone(ZoneId.of("America/Vancouver"))

str is Jan. 23, 2022 12:13:47 p.m. null.

When using ZoneId.of("UTC"), "UTC" is correctly placed at the end.

I'm willing to attempt fixing this, any pointers are appreciated. Do you think it's a problem with the data or rather can be fixed in the code?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.