Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internal font loading fails on Windows #20

Closed
arteme opened this issue Oct 29, 2021 · 5 comments
Closed

Internal font loading fails on Windows #20

arteme opened this issue Oct 29, 2021 · 5 comments
Labels
bug Something isn't working

Comments

@arteme
Copy link

arteme commented Oct 29, 2021

Configuration

OS type and version: Windows 10 21H1
JVM type and version: 11.0.13
Scala version: 2.12.13
Figlet4s version: 0.3.0

Steps

Consider the following simple test app:

import com.colofabrix.scala.figlet4s.unsafe._
import com.colofabrix.scala.figlet4s.options._

object Test extends App {

  val text = "hello, world!"
  val banner = Figlet4s.builder(text).render().asString()

  println(banner)
}

with a simple build.sbt:

name := "figlet4s-test-project"
version := "0.1"
scalaVersion := "2.12.13"
libraryDependencies += "com.colofabrix.scala" %% "figlet4s-core" % "0.3.0"

Problem

The project builds and runs fine in Linux, but crashes in Windows:

[info] done compiling
[info] running Test
[error] (run-main-0) com.colofabrix.scala.figlet4s.errors$FigletLoadingError
[error] com.colofabrix.scala.figlet4s.errors$FigletLoadingError
[error]         at com.colofabrix.scala.figlet4s.errors$FigletLoadingError$.apply(errors.scala:69)
[error]         at com.colofabrix.scala.figlet4s.core.Braket$.withResource(Braket.scala:28)
[error]         at com.colofabrix.scala.figlet4s.core.FontFileReader$.readInternal(FontFileReader.scala:27)
[error]         at com.colofabrix.scala.figlet4s.core.Figlet4sClient$.$anonfun$loadFontInternal$2(Figlet4sClient.scala:49)
[error]         at cats.package$$anon$1.flatMap(package.scala:73)
[error]         at com.colofabrix.scala.figlet4s.unsafe.package$$anon$1.flatMap(package.scala:69)
[error]         at cats.FlatMap$Ops.flatMap(FlatMap.scala:229)
[error]         at cats.FlatMap$Ops.flatMap$(FlatMap.scala:229)
[error]         at cats.FlatMap$ToFlatMapOps$$anon$2.flatMap(FlatMap.scala:243)
[error]         at com.colofabrix.scala.figlet4s.core.Figlet4sClient$.$anonfun$loadFontInternal$1(Figlet4sClient.scala:48)
[error]         at cats.package$$anon$1.flatMap(package.scala:73)
[error]         at com.colofabrix.scala.figlet4s.unsafe.package$$anon$1.flatMap(package.scala:69)
[error]         at cats.FlatMap$Ops.flatMap(FlatMap.scala:229)
[error]         at cats.FlatMap$Ops.flatMap$(FlatMap.scala:229)
[error]         at cats.FlatMap$ToFlatMapOps$$anon$2.flatMap(FlatMap.scala:243)
[error]         at com.colofabrix.scala.figlet4s.core.Figlet4sClient$.loadFontInternal(Figlet4sClient.scala:47)
[error]         at com.colofabrix.scala.figlet4s.unsafe.Figlet4s$.loadFontInternal(Figlet4s.scala:36)
[error]         at com.colofabrix.scala.figlet4s.unsafe.OptionsBuilderMixin$OptionsBuilderOps.$anonfun$options$1(OptionsBuilderMixin.scala:58)
[error]         at scala.Option.getOrElse(Option.scala:189)
[error]         at com.colofabrix.scala.figlet4s.unsafe.OptionsBuilderMixin$OptionsBuilderOps.options(OptionsBuilderMixin.scala:58)
[error]         at com.colofabrix.scala.figlet4s.unsafe.OptionsBuilderMixin$OptionsBuilderOps.render(OptionsBuilderMixin.scala:32)
[error]         at Test$.delayedEndpoint$Test$1(Test.scala:7)
[error]         at Test$delayedInit$body.apply(Test.scala:4)
[error]         at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error]         at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error]         at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error]         at scala.App.$anonfun$main$1$adapted(App.scala:80)
[error]         at scala.collection.immutable.List.foreach(List.scala:431)
[error]         at scala.App.main(App.scala:80)
[error]         at scala.App.main$(App.scala:78)
[error]         at Test$.main(Test.scala:4)
[error]         at Test.main(Test.scala)
[error]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] Caused by: java.lang.NullPointerException
[error]         at java.base/java.io.Reader.<init>(Reader.java:167)
[error]         at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:125)
[error]         at scala.io.BufferedSource.reader(BufferedSource.scala:26)
[error]         at scala.io.BufferedSource.bufferedReader(BufferedSource.scala:27)
[error]         at com.colofabrix.scala.figlet4s.core.FontFileReader$.tapSource(FontFileReader.scala:43)
[error]         at com.colofabrix.scala.figlet4s.core.FontFileReader$.$anonfun$readInternal$1(FontFileReader.scala:27)
[error]         at com.colofabrix.scala.figlet4s.core.Braket$.withResource(Braket.scala:24)
[error]         at com.colofabrix.scala.figlet4s.core.FontFileReader$.readInternal(FontFileReader.scala:27)
[error]         at com.colofabrix.scala.figlet4s.core.Figlet4sClient$.$anonfun$loadFontInternal$2(Figlet4sClient.scala:49)
[error]         at cats.package$$anon$1.flatMap(package.scala:73)
[error]         at com.colofabrix.scala.figlet4s.unsafe.package$$anon$1.flatMap(package.scala:69)
[error]         at cats.FlatMap$Ops.flatMap(FlatMap.scala:229)
[error]         at cats.FlatMap$Ops.flatMap$(FlatMap.scala:229)
[error]         at cats.FlatMap$ToFlatMapOps$$anon$2.flatMap(FlatMap.scala:243)
[error]         at com.colofabrix.scala.figlet4s.core.Figlet4sClient$.$anonfun$loadFontInternal$1(Figlet4sClient.scala:48)
[error]         at cats.package$$anon$1.flatMap(package.scala:73)
[error]         at com.colofabrix.scala.figlet4s.unsafe.package$$anon$1.flatMap(package.scala:69)
[error]         at cats.FlatMap$Ops.flatMap(FlatMap.scala:229)
[error]         at cats.FlatMap$Ops.flatMap$(FlatMap.scala:229)
[error]         at cats.FlatMap$ToFlatMapOps$$anon$2.flatMap(FlatMap.scala:243)
[error]         at com.colofabrix.scala.figlet4s.core.Figlet4sClient$.loadFontInternal(Figlet4sClient.scala:47)
[error]         at com.colofabrix.scala.figlet4s.unsafe.Figlet4s$.loadFontInternal(Figlet4s.scala:36)
[error]         at com.colofabrix.scala.figlet4s.unsafe.OptionsBuilderMixin$OptionsBuilderOps.$anonfun$options$1(OptionsBuilderMixin.scala:58)
[error]         at scala.Option.getOrElse(Option.scala:189)
[error]         at com.colofabrix.scala.figlet4s.unsafe.OptionsBuilderMixin$OptionsBuilderOps.options(OptionsBuilderMixin.scala:58)
[error]         at com.colofabrix.scala.figlet4s.unsafe.OptionsBuilderMixin$OptionsBuilderOps.render(OptionsBuilderMixin.scala:32)
[error]         at Test$.delayedEndpoint$Test$1(Test.scala:7)
[error]         at Test$delayedInit$body.apply(Test.scala:4)
[error]         at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error]         at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error]         at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error]         at scala.App.$anonfun$main$1$adapted(App.scala:80)
[error]         at scala.collection.immutable.List.foreach(List.scala:431)
[error]         at scala.App.main(App.scala:80)
[error]         at scala.App.main$(App.scala:78)
[error]         at Test$.main(Test.scala:4)
[error]         at Test.main(Test.scala)
[error]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] stack trace is suppressed; run 'last Compile / bgRun' for the full output
[error] Nonzero exit code: 1
[error] (Compile / run) Nonzero exit code: 1
[error] Total time: 62 s (01:02), completed 30 Oct 2021, 0.09.15
@arteme arteme added the bug Something isn't working label Oct 29, 2021
@arteme
Copy link
Author

arteme commented Oct 29, 2021

The problem here is the code inside loadFontInternal:

  def loadFontInternal[F[_]: Sync](name: String): F[FigletResult[FIGfont]] =
    for {
      path    <- Sync[F].pure(Paths.get("fonts", s"$name.flf").toString)
      decoder <- fileDecoder[F](Codec.ISO8859)
      font    <- FontFileReader.readInternal(path, decoder)(createFIGfont[F])
    } yield font

In linux that yields "fonts/standard.flf", while in windows this will be "fonts\standard.flf", but we're not dealing with files here. This is resource addressing and it always uses the forward slash (/) as a separator (see https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html)

@arteme arteme changed the title Font loading fails on Windows Internal font loading fails on Windows Oct 29, 2021
@ColOfAbRiX
Copy link
Owner

ColOfAbRiX commented Nov 10, 2021

Thanks, let me have a look.

I'll also try to add github actions to test on Windows

@ColOfAbRiX
Copy link
Owner

ColOfAbRiX commented Nov 15, 2021

I should have fixed all the issues on Windows that make all tests pass. There was also an issue with the line termination.

If you can and have time, would you be able to test this branch https://github.com/ColOfAbRiX/figlet4s/tree/issue-20_fix_windows

@ColOfAbRiX
Copy link
Owner

ColOfAbRiX commented Nov 19, 2021

Fixed in release 0.3.1 (I'm having issues with the releasing on sonatype, I'll publish asap)

This run shows the execution of the code you provided on Windows 10:
image

@ColOfAbRiX
Copy link
Owner

Fixed on v0.3.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants