From 6bcd4659f21a050a067fb7e090c17d1f15767ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Femen=C3=ADa?= <131800808+pablf@users.noreply.github.com> Date: Mon, 4 Sep 2023 19:17:54 +0200 Subject: [PATCH] Support for scala-native (#619) --- .github/workflows/ci.yml | 44 ++---- .scalafix.conf | 21 +-- build.sbt | 48 ++++--- .../src/main/scala/StreamDirWatch.scala | 4 +- .../src/main/scala/StreamsBasedServer.scala | 0 .../main/scala/ToUppercaseAsAService.scala | 4 +- .../src/main/scala/TextFileDump.scala | 0 .../scala-2/zio/nio/channels/package.scala | 1 - .../scala-3/zio/nio/channels/package.scala | 2 +- .../main/scala/zio/nio/ZStreamHelper.scala | 47 +++++++ .../nio/channels/AsynchronousChannel.scala | 4 +- .../channels/AsynchronousFileChannel.scala | 2 +- .../zio/nio/channels/DatagramChannel.scala | 1 - .../main/scala/zio/nio/channels/Pipe.scala | 1 - .../zio/nio/channels/SelectableChannel.scala | 2 +- .../scala/zio/nio/channels/SelectionKey.scala | 3 +- .../scala/zio/nio/channels/Selector.scala | 5 +- .../nio/channels/spi/SelectorProvider.scala | 6 +- .../nio/file/FileSystemPlatformSpecific.scala | 14 ++ .../zio/nio/file/FilesPlatformSpecific.scala | 20 +++ .../file/WatchServicePlatformSpecific.scala | 12 ++ .../AsynchronousChannelGroupSpec.scala | 0 .../zio/nio/channels/ChannelSpecJVM.scala} | 18 +-- .../nio/channels/DatagramChannelSpec.scala | 0 .../zio/nio/channels/FileChannelSpec.scala | 6 +- .../scala/zio/nio/channels/SelectorSpec.scala | 0 .../scala/zio/nio/file/WathServiceSpec.scala | 4 +- .../scala-2/zio/nio/channels/package.scala | 24 ++++ .../scala-3/zio/nio/channels/package.scala | 25 ++++ .../main/scala/zio/nio/ZStreamHelper.scala | 47 +++++++ .../nio/channels/AsynchronousChannel.scala | 130 ++++++++++++++++++ .../channels/AsynchronousFileChannel.scala | 60 ++++++++ .../nio/file/FileSystemPlatformSpecific.scala | 7 + .../zio/nio/file/FilesPlatformSpecific.scala | 29 ++++ .../file/WatchServicePlatformSpecific.scala | 3 + .../src/main/scala/zio/nio/Buffer.scala | 44 +++--- .../src/main/scala/zio/nio/ByteBuffer.scala | 1 - .../src/main/scala/zio/nio/CharBuffer.scala | 1 - .../src/main/scala/zio/nio/DoubleBuffer.scala | 1 - .../src/main/scala/zio/nio/FloatBuffer.scala | 1 - .../src/main/scala/zio/nio/IOCloseable.scala | 1 - .../src/main/scala/zio/nio/InetAddress.scala | 1 - .../scala/zio/nio/InetSocketAddress.scala | 1 - .../src/main/scala/zio/nio/IntBuffer.scala | 1 - .../main/scala/zio/nio/InterfaceAddress.scala | 2 - .../src/main/scala/zio/nio/LongBuffer.scala | 1 - .../main/scala/zio/nio/MappedByteBuffer.scala | 3 +- .../main/scala/zio/nio/NetworkInterface.scala | 8 +- .../src/main/scala/zio/nio/ShortBuffer.scala | 1 - .../channels/AsynchronousChannelGroup.scala | 1 - .../main/scala/zio/nio/channels/Channel.scala | 2 +- .../scala/zio/nio/channels/FileChannel.scala | 4 +- .../scala/zio/nio/channels/FileLock.scala | 1 - .../zio/nio/channels/GatheringByteOps.scala | 3 +- .../zio/nio/channels/ScatteringByteOps.scala | 1 - .../scala/zio/nio/charset/AutoDetect.scala | 2 +- .../main/scala/zio/nio/charset/Charset.scala | 14 +- .../zio/nio/charset/CharsetDecoder.scala | 1 - .../zio/nio/charset/CharsetEncoder.scala | 1 - .../scala/zio/nio/charset/CoderResult.scala | 2 - .../main/scala/zio/nio/file/FileSystem.scala | 11 +- .../src/main/scala/zio/nio/file/Files.scala | 25 ++-- .../src/main/scala/zio/nio/file/Path.scala | 1 - .../scala/zio/nio/file/WatchService.scala | 7 +- .../src/main/scala/zio/nio/file/package.scala | 2 - .../src/main/scala/zio/nio/package.scala | 4 - .../test/resources/async_file_read_test.txt | 0 .../test/resources/scattering_read_test.txt | 0 .../src/test/scala/zio/nio/BaseSpec.scala | 0 .../src/test/scala/zio/nio/BufferSpec.scala | 0 .../scala/zio/nio/channels/ChannelSpec.scala | 27 ++++ .../channels/ScatterGatherChannelSpec.scala | 6 +- .../scala/zio/nio/charset/CharsetSpec.scala | 0 .../test/scala/zio/nio/file/FilesSpec.scala | 9 +- .../test/scala/zio/nio/file/PathSpec.scala | 2 +- project/BuildHelper.scala | 48 +++---- project/plugins.sbt | 4 +- 77 files changed, 605 insertions(+), 234 deletions(-) rename examples/{ => jvm}/src/main/scala/StreamDirWatch.scala (97%) rename examples/{ => jvm}/src/main/scala/StreamsBasedServer.scala (100%) rename examples/{ => jvm}/src/main/scala/ToUppercaseAsAService.scala (95%) rename examples/{ => shared}/src/main/scala/TextFileDump.scala (100%) rename nio/{ => jvm}/src/main/scala-2/zio/nio/channels/package.scala (95%) rename nio/{ => jvm}/src/main/scala-3/zio/nio/channels/package.scala (95%) create mode 100644 nio/jvm/src/main/scala/zio/nio/ZStreamHelper.scala rename nio/{ => jvm}/src/main/scala/zio/nio/channels/AsynchronousChannel.scala (99%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala (99%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/DatagramChannel.scala (99%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/Pipe.scala (96%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/SelectableChannel.scala (99%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/SelectionKey.scala (98%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/Selector.scala (98%) rename nio/{ => jvm}/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala (93%) create mode 100644 nio/jvm/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala create mode 100644 nio/jvm/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala create mode 100644 nio/jvm/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala rename nio/{ => jvm}/src/test/scala/zio/nio/channels/AsynchronousChannelGroupSpec.scala (100%) rename nio/{src/test/scala/zio/nio/channels/ChannelSpec.scala => jvm/src/test/scala/zio/nio/channels/ChannelSpecJVM.scala} (93%) rename nio/{ => jvm}/src/test/scala/zio/nio/channels/DatagramChannelSpec.scala (100%) rename nio/{ => jvm}/src/test/scala/zio/nio/channels/FileChannelSpec.scala (94%) rename nio/{ => jvm}/src/test/scala/zio/nio/channels/SelectorSpec.scala (100%) rename nio/{ => jvm}/src/test/scala/zio/nio/file/WathServiceSpec.scala (73%) create mode 100644 nio/native/src/main/scala-2/zio/nio/channels/package.scala create mode 100644 nio/native/src/main/scala-3/zio/nio/channels/package.scala create mode 100644 nio/native/src/main/scala/zio/nio/ZStreamHelper.scala create mode 100644 nio/native/src/main/scala/zio/nio/channels/AsynchronousChannel.scala create mode 100644 nio/native/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala create mode 100644 nio/native/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala create mode 100644 nio/native/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala create mode 100644 nio/native/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala rename nio/{ => shared}/src/main/scala/zio/nio/Buffer.scala (92%) rename nio/{ => shared}/src/main/scala/zio/nio/ByteBuffer.scala (99%) rename nio/{ => shared}/src/main/scala/zio/nio/CharBuffer.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/DoubleBuffer.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/FloatBuffer.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/IOCloseable.scala (82%) rename nio/{ => shared}/src/main/scala/zio/nio/InetAddress.scala (98%) rename nio/{ => shared}/src/main/scala/zio/nio/InetSocketAddress.scala (99%) rename nio/{ => shared}/src/main/scala/zio/nio/IntBuffer.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/InterfaceAddress.scala (87%) rename nio/{ => shared}/src/main/scala/zio/nio/LongBuffer.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/MappedByteBuffer.scala (91%) rename nio/{ => shared}/src/main/scala/zio/nio/NetworkInterface.scala (94%) rename nio/{ => shared}/src/main/scala/zio/nio/ShortBuffer.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/channels/Channel.scala (96%) rename nio/{ => shared}/src/main/scala/zio/nio/channels/FileChannel.scala (98%) rename nio/{ => shared}/src/main/scala/zio/nio/channels/FileLock.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/channels/GatheringByteOps.scala (97%) rename nio/{ => shared}/src/main/scala/zio/nio/channels/ScatteringByteOps.scala (98%) rename nio/{ => shared}/src/main/scala/zio/nio/charset/AutoDetect.scala (80%) rename nio/{ => shared}/src/main/scala/zio/nio/charset/Charset.scala (94%) rename nio/{ => shared}/src/main/scala/zio/nio/charset/CharsetDecoder.scala (99%) rename nio/{ => shared}/src/main/scala/zio/nio/charset/CharsetEncoder.scala (99%) rename nio/{ => shared}/src/main/scala/zio/nio/charset/CoderResult.scala (93%) rename nio/{ => shared}/src/main/scala/zio/nio/file/FileSystem.scala (91%) rename nio/{ => shared}/src/main/scala/zio/nio/file/Files.scala (96%) rename nio/{ => shared}/src/main/scala/zio/nio/file/Path.scala (98%) rename nio/{ => shared}/src/main/scala/zio/nio/file/WatchService.scala (96%) rename nio/{ => shared}/src/main/scala/zio/nio/file/package.scala (90%) rename nio/{ => shared}/src/main/scala/zio/nio/package.scala (91%) rename nio/{ => shared}/src/test/resources/async_file_read_test.txt (100%) rename nio/{ => shared}/src/test/resources/scattering_read_test.txt (100%) rename nio/{ => shared}/src/test/scala/zio/nio/BaseSpec.scala (100%) rename nio/{ => shared}/src/test/scala/zio/nio/BufferSpec.scala (100%) create mode 100644 nio/shared/src/test/scala/zio/nio/channels/ChannelSpec.scala rename nio/{ => shared}/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala (89%) rename nio/{ => shared}/src/test/scala/zio/nio/charset/CharsetSpec.scala (100%) rename nio/{ => shared}/src/test/scala/zio/nio/file/FilesSpec.scala (93%) rename nio/{ => shared}/src/test/scala/zio/nio/file/PathSpec.scala (94%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 593d7b02..b378a33b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,11 +47,12 @@ jobs: strategy: fail-fast: false matrix: - java: ['adopt@1.8'] - scala: ['2.11.12', '2.12.17', '2.13.10', '3.2.0'] + java: ['adopt@1.8', '11', '17'] + scala: ['2.12.15', '2.13.11', '3.3.0'] + platform: ['JVM', 'Native'] steps: - name: Checkout current branch - uses: actions/checkout@v3.0.0 + uses: actions/checkout@v3.3.0 with: fetch-depth: 0 - name: Setup Scala and Java @@ -60,37 +61,20 @@ jobs: java-version: ${{ matrix.java }} - name: Cache scala dependencies uses: coursier/cache-action@v6 - - name: Test 2.x - if: ${{ !startsWith(matrix.scala, '3.') }} - run: ./sbt ++${{ matrix.scala }}! test - - name: Test 3.x - if: ${{ startsWith(matrix.scala, '3.') }} - run: ./sbt ++${{ matrix.scala }}! testDotty - - testJvms: - runs-on: ubuntu-20.04 - timeout-minutes: 30 - strategy: - fail-fast: false - matrix: - java: ['11', '17'] - steps: - - name: Checkout current branch - uses: actions/checkout@v3.0.0 - with: - fetch-depth: 0 - - name: Setup Scala and Java - uses: olafurpg/setup-scala@v13 + - name: Install libuv + if: matrix.platform == 'Native' + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Set Swap Space + if: matrix.platform == 'Native' + uses: pierotofy/set-swap-space@master with: - java-version: ${{ matrix.java }} - - name: Cache scala dependencies - uses: coursier/cache-action@v6 - - name: Test - run: ./sbt test + swap-size-gb: 9 + - name: Tests + run: ./sbt ++${{ matrix.scala }} zioNio${{ matrix.platform }}/test ci: runs-on: ubuntu-20.04 - needs: [lint, mdoc, test, testJvms] + needs: [lint, mdoc, test] steps: - name: Report successful build run: echo "ci passed" diff --git a/.scalafix.conf b/.scalafix.conf index b090394c..c00d726e 100644 --- a/.scalafix.conf +++ b/.scalafix.conf @@ -1,27 +1,8 @@ rules = [ - Disable DisableSyntax - ExplicitResultTypes LeakingImplicitClassVal NoAutoTupling NoValInForComprehension - OrganizeImports ProcedureSyntax RemoveUnused -] - -Disable { - ifSynthetic = [ - "scala/Option.option2Iterable" - "scala/Predef.any2stringadd" - ] -} - -OrganizeImports { - # Allign with IntelliJ IDEA so that they don't fight each other - groupedImports = Merge -} - -RemoveUnused { - imports = false // handled by OrganizeImports -} +] \ No newline at end of file diff --git a/build.sbt b/build.sbt index c14ee4a3..6cfbbc43 100644 --- a/build.sbt +++ b/build.sbt @@ -7,7 +7,10 @@ inThisBuild( licenses := List("Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0")), developers := List( Developer("jdegoes", "John De Goes", "john@degoes.net", url("http://degoes.net")) - ) + ), + scalaVersion := "2.13.11", + semanticdbEnabled := true, + semanticdbVersion := scalafixSemanticdb.revision ) ) @@ -19,29 +22,40 @@ addCommandAlias( ";zioNio/test;examples/test" ) -val zioVersion = "2.0.6" +val zioVersion = "2.0.16" + +lazy val root = crossProject(JVMPlatform, NativePlatform) + .in(file(".")) + .settings(publish / skip := true) + .aggregate(zioNio, examples) -lazy val zioNio = project +lazy val zioNio = crossProject(JVMPlatform, NativePlatform) .in(file("nio")) .settings(stdSettings("zio-nio")) - .settings( + .settings(crossProjectSettings) + .settings(buildInfoSettings("zio.nio")) + .settings(scala3Settings) + .jvmSettings( libraryDependencies ++= Seq( "dev.zio" %% "zio" % zioVersion, "dev.zio" %% "zio-streams" % zioVersion, - "org.scala-lang.modules" %% "scala-collection-compat" % "2.9.0", + "org.scala-lang.modules" %% "scala-collection-compat" % "2.11.0", "dev.zio" %% "zio-test" % zioVersion % Test, "dev.zio" %% "zio-test-sbt" % zioVersion % Test ), testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) - .settings(scala3Settings) - .settings( - scalacOptions ++= { - if (scalaVersion.value == Scala3) - Seq.empty - else - Seq("-P:silencer:globalFilters=[zio.stacktracer.TracingImplicits.disableAutoTrace]") - } + .nativeSettings(Test / fork := false) + .nativeSettings( + libraryDependencies ++= Seq( + "dev.zio" %%% "zio" % zioVersion, + "dev.zio" %%% "zio-streams" % zioVersion, + "org.scala-lang.modules" %%% "scala-collection-compat" % "2.11.0", + "dev.zio" %%% "zio-test" % zioVersion % Test, + "dev.zio" %%% "zio-test-sbt" % zioVersion % Test, + "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" + ), + testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) lazy val docs = project @@ -51,21 +65,23 @@ lazy val docs = project moduleName := "zio-nio-docs", scalacOptions -= "-Yno-imports", scalacOptions -= "-Xfatal-warnings", - ScalaUnidoc / unidoc / unidocProjectFilter := inProjects(zioNio), + ScalaUnidoc / unidoc / unidocProjectFilter := inProjects(zioNio.jvm), ScalaUnidoc / unidoc / target := (LocalRootProject / baseDirectory).value / "website" / "static" / "api", cleanFiles += (ScalaUnidoc / unidoc / target).value, docusaurusCreateSite := docusaurusCreateSite.dependsOn(Compile / unidoc).value, docusaurusPublishGhpages := docusaurusPublishGhpages.dependsOn(Compile / unidoc).value ) - .dependsOn(zioNio) + .dependsOn(zioNio.jvm) .enablePlugins(MdocPlugin, DocusaurusPlugin, ScalaUnidocPlugin) -lazy val examples = project +lazy val examples = crossProject(JVMPlatform, NativePlatform) .in(file("examples")) .settings(stdSettings("examples")) .settings( publish / skip := true, moduleName := "examples" ) + .settings(crossProjectSettings) + .settings(buildInfoSettings("examples")) .settings(scala3Settings) .dependsOn(zioNio) diff --git a/examples/src/main/scala/StreamDirWatch.scala b/examples/jvm/src/main/scala/StreamDirWatch.scala similarity index 97% rename from examples/src/main/scala/StreamDirWatch.scala rename to examples/jvm/src/main/scala/StreamDirWatch.scala index ee2c3fc0..878d05b6 100644 --- a/examples/src/main/scala/StreamDirWatch.scala +++ b/examples/jvm/src/main/scala/StreamDirWatch.scala @@ -2,7 +2,9 @@ package zio package nio package examples -import zio.nio.file.{Path, WatchService} +import zio.nio.file.Path +import zio.nio.file.WatchService + import zio.{Console, ZIOAppDefault} import java.nio.file.{StandardWatchEventKinds, WatchEvent} diff --git a/examples/src/main/scala/StreamsBasedServer.scala b/examples/jvm/src/main/scala/StreamsBasedServer.scala similarity index 100% rename from examples/src/main/scala/StreamsBasedServer.scala rename to examples/jvm/src/main/scala/StreamsBasedServer.scala diff --git a/examples/src/main/scala/ToUppercaseAsAService.scala b/examples/jvm/src/main/scala/ToUppercaseAsAService.scala similarity index 95% rename from examples/src/main/scala/ToUppercaseAsAService.scala rename to examples/jvm/src/main/scala/ToUppercaseAsAService.scala index d69d0efa..b62866ad 100644 --- a/examples/src/main/scala/ToUppercaseAsAService.scala +++ b/examples/jvm/src/main/scala/ToUppercaseAsAService.scala @@ -3,7 +3,9 @@ package nio package examples import zio._ -import zio.nio.channels.{BlockingNioOps, ServerSocketChannel, SocketChannel} +import zio.nio.channels.BlockingNioOps +import zio.nio.channels.{ServerSocketChannel, SocketChannel} + import zio.nio.charset.Charset import zio.stream._ diff --git a/examples/src/main/scala/TextFileDump.scala b/examples/shared/src/main/scala/TextFileDump.scala similarity index 100% rename from examples/src/main/scala/TextFileDump.scala rename to examples/shared/src/main/scala/TextFileDump.scala diff --git a/nio/src/main/scala-2/zio/nio/channels/package.scala b/nio/jvm/src/main/scala-2/zio/nio/channels/package.scala similarity index 95% rename from nio/src/main/scala-2/zio/nio/channels/package.scala rename to nio/jvm/src/main/scala-2/zio/nio/channels/package.scala index 8828dbb2..cbd69dff 100644 --- a/nio/src/main/scala-2/zio/nio/channels/package.scala +++ b/nio/jvm/src/main/scala-2/zio/nio/channels/package.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Trace, ZIO} import java.io.IOException diff --git a/nio/src/main/scala-3/zio/nio/channels/package.scala b/nio/jvm/src/main/scala-3/zio/nio/channels/package.scala similarity index 95% rename from nio/src/main/scala-3/zio/nio/channels/package.scala rename to nio/jvm/src/main/scala-3/zio/nio/channels/package.scala index 8b00e00a..60eb948d 100644 --- a/nio/src/main/scala-3/zio/nio/channels/package.scala +++ b/nio/jvm/src/main/scala-3/zio/nio/channels/package.scala @@ -1,6 +1,6 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{ZIO, Trace} import java.io.IOException diff --git a/nio/jvm/src/main/scala/zio/nio/ZStreamHelper.scala b/nio/jvm/src/main/scala/zio/nio/ZStreamHelper.scala new file mode 100644 index 00000000..84e683f5 --- /dev/null +++ b/nio/jvm/src/main/scala/zio/nio/ZStreamHelper.scala @@ -0,0 +1,47 @@ +package zio.nio + +import zio.stream.ZStream +import zio.{Scope, ZIO, Trace} + +/** + * A mutable buffer of shorts. + */ +object ZStreamHelper { + + /** + * Creates a stream from a Java stream + */ + final def fromJavaStream[A](stream: => java.util.stream.Stream[A])(implicit + trace: Trace + ): ZStream[Any, Throwable, A] = + fromJavaStream(stream, ZStream.DefaultChunkSize) + + /** + * Creates a stream from a Java stream + */ + final def fromJavaStream[A]( + stream: => java.util.stream.Stream[A], + chunkSize: Int + )(implicit trace: Trace): ZStream[Any, Throwable, A] = + ZStream.fromJavaIteratorScoped( + ZIO.acquireRelease(ZIO.attempt(stream))(stream => ZIO.succeed(stream.close())).map(_.iterator()), + chunkSize + ) + + /** + * Creates a stream from a scoped Java stream + */ + final def fromJavaStreamScoped[R, A](stream: => ZIO[Scope with R, Throwable, java.util.stream.Stream[A]])(implicit + trace: Trace + ): ZStream[R, Throwable, A] = + fromJavaStreamScoped[R, A](stream, ZStream.DefaultChunkSize) + + /** + * Creates a stream from a scoped Java stream + */ + final def fromJavaStreamScoped[R, A]( + stream: => ZIO[Scope with R, Throwable, java.util.stream.Stream[A]], + chunkSize: Int + )(implicit trace: Trace): ZStream[R, Throwable, A] = + ZStream.scoped[R](stream).flatMap(fromJavaStream(_, chunkSize)) +} diff --git a/nio/src/main/scala/zio/nio/channels/AsynchronousChannel.scala b/nio/jvm/src/main/scala/zio/nio/channels/AsynchronousChannel.scala similarity index 99% rename from nio/src/main/scala/zio/nio/channels/AsynchronousChannel.scala rename to nio/jvm/src/main/scala/zio/nio/channels/AsynchronousChannel.scala index 3e9b885c..52431518 100644 --- a/nio/src/main/scala/zio/nio/channels/AsynchronousChannel.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/AsynchronousChannel.scala @@ -1,7 +1,7 @@ package zio.nio package channels import zio._ -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.stream.{Stream, ZSink, ZStream} import java.io.{EOFException, IOException} @@ -149,7 +149,7 @@ object AsynchronousByteChannel { )(op: C => CompletionHandler[A, Any] => Any)(implicit trace: Trace): IO[IOException, A] = ZIO .attempt(op(channel)) - .flatMap(ZIO.asyncWithCompletionHandler) + .flatMap(ZIO.asyncWithCompletionHandler _) .refineToOrDie[IOException] .onInterrupt(ZIO.attempt(channel.close()).ignore) diff --git a/nio/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala b/nio/jvm/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala similarity index 99% rename from nio/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala rename to nio/jvm/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala index 95882148..cce0bc97 100644 --- a/nio/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala @@ -2,7 +2,7 @@ package zio.nio package channels import zio._ import zio.nio.file.Path -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.stream.{Stream, ZSink, ZStream} import java.io.{EOFException, IOException} diff --git a/nio/src/main/scala/zio/nio/channels/DatagramChannel.scala b/nio/jvm/src/main/scala/zio/nio/channels/DatagramChannel.scala similarity index 99% rename from nio/src/main/scala/zio/nio/channels/DatagramChannel.scala rename to nio/jvm/src/main/scala/zio/nio/channels/DatagramChannel.scala index 8d74a70d..2bfd8ccb 100644 --- a/nio/src/main/scala/zio/nio/channels/DatagramChannel.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/DatagramChannel.scala @@ -1,7 +1,6 @@ package zio.nio package channels -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{IO, Scope, Trace, UIO, ZIO} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/channels/Pipe.scala b/nio/jvm/src/main/scala/zio/nio/channels/Pipe.scala similarity index 96% rename from nio/src/main/scala/zio/nio/channels/Pipe.scala rename to nio/jvm/src/main/scala/zio/nio/channels/Pipe.scala index e063e3a7..0efa54cc 100644 --- a/nio/src/main/scala/zio/nio/channels/Pipe.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/Pipe.scala @@ -1,7 +1,6 @@ package zio.nio package channels -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{IO, Scope, Trace, ZIO} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/channels/SelectableChannel.scala b/nio/jvm/src/main/scala/zio/nio/channels/SelectableChannel.scala similarity index 99% rename from nio/src/main/scala/zio/nio/channels/SelectableChannel.scala rename to nio/jvm/src/main/scala/zio/nio/channels/SelectableChannel.scala index ba6edb19..f23b354d 100644 --- a/nio/src/main/scala/zio/nio/channels/SelectableChannel.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/SelectableChannel.scala @@ -3,7 +3,7 @@ package channels import zio.nio.channels.SelectionKey.Operation import zio.nio.channels.spi.SelectorProvider -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{Exit, Fiber, IO, Scope, Trace, UIO, ZIO} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/channels/SelectionKey.scala b/nio/jvm/src/main/scala/zio/nio/channels/SelectionKey.scala similarity index 98% rename from nio/src/main/scala/zio/nio/channels/SelectionKey.scala rename to nio/jvm/src/main/scala/zio/nio/channels/SelectionKey.scala index 707cd20f..d0850f59 100644 --- a/nio/src/main/scala/zio/nio/channels/SelectionKey.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/SelectionKey.scala @@ -1,7 +1,6 @@ package zio.nio.channels -import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.{IO, Trace, UIO, ZIO} +import zio.{Trace, UIO, ZIO} import java.nio.{channels => jc} diff --git a/nio/src/main/scala/zio/nio/channels/Selector.scala b/nio/jvm/src/main/scala/zio/nio/channels/Selector.scala similarity index 98% rename from nio/src/main/scala/zio/nio/channels/Selector.scala rename to nio/jvm/src/main/scala/zio/nio/channels/Selector.scala index 42a9aa54..482026da 100644 --- a/nio/src/main/scala/zio/nio/channels/Selector.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/Selector.scala @@ -1,9 +1,8 @@ package zio.nio package channels -import com.github.ghik.silencer.silent import zio.nio.channels.spi.SelectorProvider -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{Duration, IO, Scope, Trace, UIO, ZIO} import java.io.IOException @@ -27,7 +26,6 @@ final class Selector(private[nio] val selector: JSelector) extends IOCloseable { def provider(implicit trace: Trace): UIO[SelectorProvider] = ZIO.succeed(selector.provider()).map(new SelectorProvider(_)) - @silent def keys(implicit trace: Trace): UIO[Set[SelectionKey]] = ZIO .succeed(selector.keys()) @@ -40,7 +38,6 @@ final class Selector(private[nio] val selector: JSelector) extends IOCloseable { * an object to the key set will cause an `UnsupportedOperationException` to be thrown. The selected-key set is not * thread-safe. */ - @silent def selectedKeys(implicit trace: Trace): UIO[mutable.Set[SelectionKey]] = ZIO .succeed(selector.selectedKeys()) diff --git a/nio/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala b/nio/jvm/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala similarity index 93% rename from nio/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala rename to nio/jvm/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala index b9b772aa..d9237eb7 100644 --- a/nio/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala +++ b/nio/jvm/src/main/scala/zio/nio/channels/spi/SelectorProvider.scala @@ -1,13 +1,17 @@ package zio.nio.channels.spi import zio.nio.channels._ -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{IO, Trace, ZIO} import java.io.IOException import java.net.ProtocolFamily import java.nio.channels.spi.{SelectorProvider => JSelectorProvider} import java.nio.{channels => jc} +import zio.nio.channels.{SocketChannel, ServerSocketChannel} +import zio.nio.channels.Selector +import zio.nio.channels.DatagramChannel +import zio.nio.channels.Pipe final class SelectorProvider(private val selectorProvider: JSelectorProvider) { diff --git a/nio/jvm/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala b/nio/jvm/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala new file mode 100644 index 00000000..e6d1ca61 --- /dev/null +++ b/nio/jvm/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala @@ -0,0 +1,14 @@ +package zio.nio.file + +import zio.{Trace, ZIO, Scope} +import java.io.IOException +import java.nio.{file => jf} +import zio.nio.IOCloseableManagement + +trait FileSystemPlatformSpecific { self => + + def jFileSystem: jf.FileSystem + + def newWatchService(implicit trace: Trace): ZIO[Scope, IOException, WatchService] = + ZIO.attemptBlockingIO(WatchService.fromJava(jFileSystem.newWatchService())).toNioScoped +} diff --git a/nio/jvm/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala b/nio/jvm/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala new file mode 100644 index 00000000..f28f8197 --- /dev/null +++ b/nio/jvm/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala @@ -0,0 +1,20 @@ +package zio.nio.file + +import zio.{Trace, ZIO} + +import Files._ +import zio.stream.ZSink +import java.io.IOException + +trait FilesPlatformSpecific { + + def deleteRecursive(path: Path)(implicit trace: Trace): ZIO[Any, IOException, Long] = + newDirectoryStream(path).mapZIO { p => + for { + deletedInSubDirectory <- deleteRecursive(p).whenZIO(isDirectory(p)).map(_.getOrElse(0L)) + deletedFile <- deleteIfExists(p).whenZIO(isRegularFile(p)).map(_.getOrElse(false)).map(if (_) 1 else 0) + } yield deletedInSubDirectory + deletedFile + } + .run(ZSink.sum) <* delete(path) + +} diff --git a/nio/jvm/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala b/nio/jvm/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala new file mode 100644 index 00000000..eccbbf27 --- /dev/null +++ b/nio/jvm/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala @@ -0,0 +1,12 @@ +package zio.nio.file + +import zio._ + +import java.io.IOException + +trait WatchServicePlatformSpecific { + + def forDefaultFileSystem(implicit trace: Trace): ZIO[Scope, IOException, WatchService] = + FileSystem.default.newWatchService + +} diff --git a/nio/src/test/scala/zio/nio/channels/AsynchronousChannelGroupSpec.scala b/nio/jvm/src/test/scala/zio/nio/channels/AsynchronousChannelGroupSpec.scala similarity index 100% rename from nio/src/test/scala/zio/nio/channels/AsynchronousChannelGroupSpec.scala rename to nio/jvm/src/test/scala/zio/nio/channels/AsynchronousChannelGroupSpec.scala diff --git a/nio/src/test/scala/zio/nio/channels/ChannelSpec.scala b/nio/jvm/src/test/scala/zio/nio/channels/ChannelSpecJVM.scala similarity index 93% rename from nio/src/test/scala/zio/nio/channels/ChannelSpec.scala rename to nio/jvm/src/test/scala/zio/nio/channels/ChannelSpecJVM.scala index 93bb839b..ce00a705 100644 --- a/nio/src/test/scala/zio/nio/channels/ChannelSpec.scala +++ b/nio/jvm/src/test/scala/zio/nio/channels/ChannelSpecJVM.scala @@ -1,15 +1,15 @@ package zio.nio.channels import zio._ -import zio.nio.{BaseSpec, Buffer, EffectOps, InetSocketAddress, SocketAddress} +import zio.nio.{BaseSpec, Buffer, InetSocketAddress, SocketAddress} import zio.test.Assertion._ import zio.test._ -import java.io.{EOFException, FileNotFoundException, IOException} +import java.io.IOException import java.nio.channels import java.{nio => jnio} -object ChannelSpec extends BaseSpec { +object ChannelSpecJVM extends BaseSpec { override def spec = suite("Channel")( @@ -184,18 +184,6 @@ object ChannelSpec extends BaseSpec { } } ), - suite("explicit end-of-stream")( - test("converts EOFException to None") { - assertZIO(ZIO.fail(new EOFException).eofCheck.exit)(fails(isNone)) - }, - test("converts non EOFException to Some") { - val e: IOException = new FileNotFoundException() - assertZIO(ZIO.fail(e).eofCheck.exit)(fails(isSome(equalTo(e)))) - }, - test("passes through success") { - assertZIO(ZIO.succeed(42).eofCheck.exit)(succeeds(equalTo(42))) - } - ), suite("blocking operations")( test("read can be interrupted") { live { diff --git a/nio/src/test/scala/zio/nio/channels/DatagramChannelSpec.scala b/nio/jvm/src/test/scala/zio/nio/channels/DatagramChannelSpec.scala similarity index 100% rename from nio/src/test/scala/zio/nio/channels/DatagramChannelSpec.scala rename to nio/jvm/src/test/scala/zio/nio/channels/DatagramChannelSpec.scala diff --git a/nio/src/test/scala/zio/nio/channels/FileChannelSpec.scala b/nio/jvm/src/test/scala/zio/nio/channels/FileChannelSpec.scala similarity index 94% rename from nio/src/test/scala/zio/nio/channels/FileChannelSpec.scala rename to nio/jvm/src/test/scala/zio/nio/channels/FileChannelSpec.scala index ff650065..e2718a94 100644 --- a/nio/src/test/scala/zio/nio/channels/FileChannelSpec.scala +++ b/nio/jvm/src/test/scala/zio/nio/channels/FileChannelSpec.scala @@ -14,7 +14,7 @@ import scala.io.Source object FileChannelSpec extends BaseSpec { - private val readFile = Path("nio/src/test/resources/async_file_read_test.txt") + private val readFile = Path("nio/shared/src/test/resources/async_file_read_test.txt") private val readFileContents = "Hello World" @@ -49,7 +49,7 @@ object FileChannelSpec extends BaseSpec { } }, test("asynchronous file write") { - val path = Path("nio/src/test/resources/async_file_write_test.txt") + val path = Path("nio/shared/src/test/resources/async_file_write_test.txt") AsynchronousFileChannel .open( path, @@ -105,7 +105,7 @@ object FileChannelSpec extends BaseSpec { """Yet such is oft the course of deeds that move the wheels of the world: | small hands do them because they must, while the eyes of the great are elsewhere.""".stripMargin val stream = ZStream.fromIterable(testData).via(Charset.Standard.utf8.newEncoder.transducer()) - val file = Path("nio/src/test/resources/sink_write_test.txt") + val file = Path("nio/shared/src/test/resources/sink_write_test.txt") FileChannel .open(file, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW) .flatMapNioBlockingOps(channel => stream.run(channel.sink())) diff --git a/nio/src/test/scala/zio/nio/channels/SelectorSpec.scala b/nio/jvm/src/test/scala/zio/nio/channels/SelectorSpec.scala similarity index 100% rename from nio/src/test/scala/zio/nio/channels/SelectorSpec.scala rename to nio/jvm/src/test/scala/zio/nio/channels/SelectorSpec.scala diff --git a/nio/src/test/scala/zio/nio/file/WathServiceSpec.scala b/nio/jvm/src/test/scala/zio/nio/file/WathServiceSpec.scala similarity index 73% rename from nio/src/test/scala/zio/nio/file/WathServiceSpec.scala rename to nio/jvm/src/test/scala/zio/nio/file/WathServiceSpec.scala index 90ff4250..b92b8d22 100644 --- a/nio/src/test/scala/zio/nio/file/WathServiceSpec.scala +++ b/nio/jvm/src/test/scala/zio/nio/file/WathServiceSpec.scala @@ -15,9 +15,9 @@ object WathServiceSpec extends BaseSpec { test("Watch Service register")( FileSystem.default.newWatchService.flatMap { watchService => for { - watchKey <- Path("nio/src/test/resources").register(watchService, ENTRY_CREATE) + watchKey <- Path("nio/shared/src/test/resources").register(watchService, ENTRY_CREATE) watchable = watchKey.watchable - } yield assert(watchable)(equalTo(Path("nio/src/test/resources"))) + } yield assert(watchable)(equalTo(Path("nio/shared/src/test/resources"))) } ) ) diff --git a/nio/native/src/main/scala-2/zio/nio/channels/package.scala b/nio/native/src/main/scala-2/zio/nio/channels/package.scala new file mode 100644 index 00000000..3559d97f --- /dev/null +++ b/nio/native/src/main/scala-2/zio/nio/channels/package.scala @@ -0,0 +1,24 @@ +package zio.nio + +import zio.{Trace, ZIO} + +import java.io.IOException + +package object channels { + + implicit final class BlockingNioOps[-R, +C <: BlockingChannel]( + private val underlying: ZIO[R, IOException, C] + ) extends AnyVal { + + def flatMapNioBlocking[R1, E >: IOException, A]( + f: (C, C#BlockingOps) => ZIO[R1, E, A] + )(implicit trace: Trace): ZIO[R with R1 with Any, E, A] = + underlying.flatMap(c => c.flatMapBlocking(f(c, _))) + + def flatMapNioBlockingOps[R1, E >: IOException, A]( + f: C#BlockingOps => ZIO[R1, E, A] + )(implicit trace: Trace): ZIO[R with R1 with Any, E, A] = flatMapNioBlocking((_, ops) => f(ops)) + + } + +} diff --git a/nio/native/src/main/scala-3/zio/nio/channels/package.scala b/nio/native/src/main/scala-3/zio/nio/channels/package.scala new file mode 100644 index 00000000..b544434c --- /dev/null +++ b/nio/native/src/main/scala-3/zio/nio/channels/package.scala @@ -0,0 +1,25 @@ +package zio.nio + + +import zio.{ZIO, Trace} + +import java.io.IOException + +package object channels { + + implicit final class BlockingNioOps[-R, BO, C <: BlockingChannel { type BlockingOps <: BO }]( + private val underlying: ZIO[R, IOException, C] + ) extends AnyVal { + type F1[R, E, A] = (C, BO) => ZIO[R, E, A] + + def flatMapNioBlocking[R1, E >: IOException, A]( + f: F1[R1, E, A] + )(implicit trace: Trace): ZIO[R with R1, E, A] = underlying.flatMap(c => c.flatMapBlocking(f(c, _))) + + def flatMapNioBlockingOps[R1, E >: IOException, A]( + f: BO => ZIO[R1, E, A] + )(implicit trace: Trace): ZIO[R with R1, E, A] = flatMapNioBlocking((_, ops) => f(ops)) + + } + +} diff --git a/nio/native/src/main/scala/zio/nio/ZStreamHelper.scala b/nio/native/src/main/scala/zio/nio/ZStreamHelper.scala new file mode 100644 index 00000000..84e683f5 --- /dev/null +++ b/nio/native/src/main/scala/zio/nio/ZStreamHelper.scala @@ -0,0 +1,47 @@ +package zio.nio + +import zio.stream.ZStream +import zio.{Scope, ZIO, Trace} + +/** + * A mutable buffer of shorts. + */ +object ZStreamHelper { + + /** + * Creates a stream from a Java stream + */ + final def fromJavaStream[A](stream: => java.util.stream.Stream[A])(implicit + trace: Trace + ): ZStream[Any, Throwable, A] = + fromJavaStream(stream, ZStream.DefaultChunkSize) + + /** + * Creates a stream from a Java stream + */ + final def fromJavaStream[A]( + stream: => java.util.stream.Stream[A], + chunkSize: Int + )(implicit trace: Trace): ZStream[Any, Throwable, A] = + ZStream.fromJavaIteratorScoped( + ZIO.acquireRelease(ZIO.attempt(stream))(stream => ZIO.succeed(stream.close())).map(_.iterator()), + chunkSize + ) + + /** + * Creates a stream from a scoped Java stream + */ + final def fromJavaStreamScoped[R, A](stream: => ZIO[Scope with R, Throwable, java.util.stream.Stream[A]])(implicit + trace: Trace + ): ZStream[R, Throwable, A] = + fromJavaStreamScoped[R, A](stream, ZStream.DefaultChunkSize) + + /** + * Creates a stream from a scoped Java stream + */ + final def fromJavaStreamScoped[R, A]( + stream: => ZIO[Scope with R, Throwable, java.util.stream.Stream[A]], + chunkSize: Int + )(implicit trace: Trace): ZStream[R, Throwable, A] = + ZStream.scoped[R](stream).flatMap(fromJavaStream(_, chunkSize)) +} diff --git a/nio/native/src/main/scala/zio/nio/channels/AsynchronousChannel.scala b/nio/native/src/main/scala/zio/nio/channels/AsynchronousChannel.scala new file mode 100644 index 00000000..b3ed1b58 --- /dev/null +++ b/nio/native/src/main/scala/zio/nio/channels/AsynchronousChannel.scala @@ -0,0 +1,130 @@ +package zio.nio +package channels +import zio._ + +import java.io.IOException +import java.net.SocketOption +import java.nio.channels.{ + AsynchronousByteChannel => JAsynchronousByteChannel, + AsynchronousServerSocketChannel => JAsynchronousServerSocketChannel, + AsynchronousSocketChannel => JAsynchronousSocketChannel +} + +/** + * A byte channel that reads and writes asynchronously. + * + * The read and write operations will never block the calling thread. + */ +abstract class AsynchronousByteChannel private[channels] (protected val channel: JAsynchronousByteChannel) + extends Channel {} + +object AsynchronousByteChannel {} + +final class AsynchronousServerSocketChannel(protected val channel: JAsynchronousServerSocketChannel) extends Channel { + + def bindTo(local: SocketAddress, backlog: Int = 0)(implicit trace: Trace): IO[IOException, Unit] = + bind(Some(local), backlog) + + def bindAuto(backlog: Int = 0)(implicit trace: Trace): IO[IOException, Unit] = bind(None, backlog) + + /** + * Binds the channel's socket to a local address and configures the socket to listen for connections, up to backlog + * pending connection. + */ + def bind(address: Option[SocketAddress], backlog: Int = 0)(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.bind(address.map(_.jSocketAddress).orNull, backlog)).refineToOrDie[IOException].unit + + def setOption[T](name: SocketOption[T], value: T)(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.setOption(name, value)).refineToOrDie[IOException].unit + + /** + * The `SocketAddress` that the socket is bound to, or the `SocketAddress` representing the loopback address if denied + * by the security manager, or `Maybe.empty` if the channel's socket is not bound. + */ + def localAddress(implicit trace: Trace): IO[IOException, Option[SocketAddress]] = + ZIO + .attempt( + Option(channel.getLocalAddress).map(SocketAddress.fromJava) + ) + .refineToOrDie[IOException] + +} + +object AsynchronousServerSocketChannel { + + def open(implicit trace: Trace): ZIO[Scope, IOException, AsynchronousServerSocketChannel] = + ZIO + .attempt(new AsynchronousServerSocketChannel(JAsynchronousServerSocketChannel.open())) + .refineToOrDie[IOException] + .toNioScoped + + def open( + channelGroup: AsynchronousChannelGroup + )(implicit trace: Trace): ZIO[Scope, IOException, AsynchronousServerSocketChannel] = + ZIO + .attempt(new AsynchronousServerSocketChannel(JAsynchronousServerSocketChannel.open(channelGroup.channelGroup))) + .refineToOrDie[IOException] + .toNioScoped + + def fromJava(channel: JAsynchronousServerSocketChannel): AsynchronousServerSocketChannel = + new AsynchronousServerSocketChannel(channel) + +} + +final class AsynchronousSocketChannel(override protected val channel: JAsynchronousSocketChannel) + extends AsynchronousByteChannel(channel) { + + def bindTo(address: SocketAddress)(implicit trace: Trace): IO[IOException, Unit] = bind(Some(address)) + + def bindAuto(implicit trace: Trace): IO[IOException, Unit] = bind(None) + + def bind(address: Option[SocketAddress])(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.bind(address.map(_.jSocketAddress).orNull)).refineToOrDie[IOException].unit + + def setOption[T](name: SocketOption[T], value: T)(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.setOption(name, value)).refineToOrDie[IOException].unit + + def shutdownInput(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.shutdownInput()).refineToOrDie[IOException].unit + + def shutdownOutput(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.shutdownOutput()).refineToOrDie[IOException].unit + + def remoteAddress(implicit trace: Trace): IO[IOException, Option[SocketAddress]] = + ZIO + .attempt( + Option(channel.getRemoteAddress) + .map(SocketAddress.fromJava) + ) + .refineToOrDie[IOException] + + def localAddress(implicit trace: Trace): IO[IOException, Option[SocketAddress]] = + ZIO + .attempt( + Option(channel.getLocalAddress) + .map(SocketAddress.fromJava) + ) + .refineToOrDie[IOException] + +} + +object AsynchronousSocketChannel { + + def open(implicit trace: Trace): ZIO[Scope, IOException, AsynchronousSocketChannel] = + ZIO + .attempt(new AsynchronousSocketChannel(JAsynchronousSocketChannel.open())) + .refineToOrDie[IOException] + .toNioScoped + + def open( + channelGroup: AsynchronousChannelGroup + )(implicit trace: Trace): ZIO[Scope, IOException, AsynchronousSocketChannel] = + ZIO + .attempt(new AsynchronousSocketChannel(JAsynchronousSocketChannel.open(channelGroup.channelGroup))) + .refineToOrDie[IOException] + .toNioScoped + + def fromJava(asyncSocketChannel: JAsynchronousSocketChannel): AsynchronousSocketChannel = + new AsynchronousSocketChannel(asyncSocketChannel) + +} diff --git a/nio/native/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala b/nio/native/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala new file mode 100644 index 00000000..c0cca695 --- /dev/null +++ b/nio/native/src/main/scala/zio/nio/channels/AsynchronousFileChannel.scala @@ -0,0 +1,60 @@ +package zio.nio +package channels +import zio._ +import zio.nio.file.Path + +import java.io.IOException +import java.nio.channels.{AsynchronousFileChannel => JAsynchronousFileChannel} +import java.nio.file.OpenOption +import java.nio.file.attribute.FileAttribute +import scala.concurrent.ExecutionContextExecutorService +import scala.jdk.CollectionConverters._ + +final class AsynchronousFileChannel(protected val channel: JAsynchronousFileChannel) extends Channel { + + def force(metaData: Boolean)(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.force(metaData)).refineToOrDie[IOException] + + def size(implicit trace: Trace): IO[IOException, Long] = ZIO.attempt(channel.size()).refineToOrDie[IOException] + + def truncate(size: Long)(implicit trace: Trace): IO[IOException, Unit] = + ZIO.attempt(channel.truncate(size)).refineToOrDie[IOException].unit + + def tryLock( + position: Long = 0L, + size: Long = Long.MaxValue, + shared: Boolean = false + )(implicit trace: Trace): IO[IOException, FileLock] = + ZIO.attempt(new FileLock(channel.tryLock(position, size, shared))).refineToOrDie[IOException] + +} + +object AsynchronousFileChannel { + + def open(file: Path, options: OpenOption*)(implicit + trace: Trace + ): ZIO[Scope, IOException, AsynchronousFileChannel] = + ZIO + .attempt(new AsynchronousFileChannel(JAsynchronousFileChannel.open(file.javaPath, options: _*))) + .refineToOrDie[IOException] + .toNioScoped + + def open( + file: Path, + options: Set[OpenOption], + executor: Option[ExecutionContextExecutorService], + attrs: Set[FileAttribute[_]] + )(implicit trace: Trace): ZIO[Scope, IOException, AsynchronousFileChannel] = + ZIO + .attempt( + new AsynchronousFileChannel( + JAsynchronousFileChannel.open(file.javaPath, options.asJava, executor.orNull, attrs.toSeq: _*) + ) + ) + .refineToOrDie[IOException] + .toNioScoped + + def fromJava(javaAsynchronousFileChannel: JAsynchronousFileChannel): AsynchronousFileChannel = + new AsynchronousFileChannel(javaAsynchronousFileChannel) + +} diff --git a/nio/native/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala b/nio/native/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala new file mode 100644 index 00000000..802ea143 --- /dev/null +++ b/nio/native/src/main/scala/zio/nio/file/FileSystemPlatformSpecific.scala @@ -0,0 +1,7 @@ +package zio.nio.file + +import java.nio.{file => jf} + +trait FileSystemPlatformSpecific { self => + def jFileSystem: jf.FileSystem +} diff --git a/nio/native/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala b/nio/native/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala new file mode 100644 index 00000000..19f11011 --- /dev/null +++ b/nio/native/src/main/scala/zio/nio/file/FilesPlatformSpecific.scala @@ -0,0 +1,29 @@ +package zio.nio.file + +import java.nio.file.{Files => JFiles, SimpleFileVisitor, Path => JPath} +import java.io.IOException +import zio.{Trace, ZIO} +import java.nio.file.FileVisitResult +import java.nio.file.attribute.BasicFileAttributes +import java.nio.file.FileVisitor + +trait FilesPlatformSpecific { + + private val visitator: FileVisitor[JPath] = new SimpleFileVisitor[JPath]() { + + override def visitFile(file: JPath, attrs: BasicFileAttributes) = { + JFiles.delete(file) + FileVisitResult.CONTINUE + } + + override def postVisitDirectory(dir: JPath, exc: IOException) = { + JFiles.delete(dir) + FileVisitResult.CONTINUE + } + + } + + def deleteRecursive(path: Path)(implicit trace: Trace): ZIO[Any, IOException, Long] = + ZIO.attemptBlockingIO(JFiles.walkFileTree(path.javaPath, visitator)) *> ZIO.succeed(0L) + +} diff --git a/nio/native/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala b/nio/native/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala new file mode 100644 index 00000000..6f7c466f --- /dev/null +++ b/nio/native/src/main/scala/zio/nio/file/WatchServicePlatformSpecific.scala @@ -0,0 +1,3 @@ +package zio.nio.file + +trait WatchServicePlatformSpecific diff --git a/nio/src/main/scala/zio/nio/Buffer.scala b/nio/shared/src/main/scala/zio/nio/Buffer.scala similarity index 92% rename from nio/src/main/scala/zio/nio/Buffer.scala rename to nio/shared/src/main/scala/zio/nio/Buffer.scala index c268e799..a5ccbffb 100644 --- a/nio/src/main/scala/zio/nio/Buffer.scala +++ b/nio/shared/src/main/scala/zio/nio/Buffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ @@ -14,7 +13,6 @@ import java.nio.{ LongBuffer => JLongBuffer, ShortBuffer => JShortBuffer } -import scala.reflect.ClassTag /** * Mutable buffer of value elements. @@ -84,7 +82,7 @@ import scala.reflect.ClassTag * }}} */ @specialized // See if Specialized will work on return values, e.g. `get` -abstract class Buffer[A: ClassTag] private[nio] () { +abstract class Buffer[A] private[nio] () { protected[nio] val buffer: JBuffer @@ -365,6 +363,12 @@ abstract class Buffer[A: ClassTag] private[nio] () { object Buffer { + // Transforms NegativeArraySizeException to IllegalArgumentException due to scala-native specifications. + private def transformError[A](effect: UIO[A]): UIO[A] = + effect.catchSomeDefect { case _: NegativeArraySizeException => + ZIO.succeed(throw new IllegalArgumentException()) + } + /** * Allocates a byte buffer backed by a new array. * @@ -376,7 +380,7 @@ object Buffer { * The number of bytes to allocate. */ def byte(capacity: Int)(implicit trace: Trace): UIO[ByteBuffer] = - ZIO.succeed(byteFromJava(JByteBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(byteFromJava(JByteBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -388,7 +392,7 @@ object Buffer { * The data to copy into the new buffer. */ def byte(chunk: Chunk[Byte])(implicit trace: Trace): UIO[ByteBuffer] = - ZIO.succeed(byteFromJava(JByteBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(byteFromJava(JByteBuffer.wrap(chunk.toArray))) /** * Allocates a direct byte buffer. @@ -401,7 +405,7 @@ object Buffer { * The number of bytes to allocate. */ def byteDirect(capacity: Int)(implicit trace: Trace): UIO[ByteBuffer] = - ZIO.succeed(byteFromJava(JByteBuffer.allocateDirect(capacity))) + Buffer transformError ZIO.succeed(byteFromJava(JByteBuffer.allocateDirect(capacity))) /** * Wraps an existing Java `ByteBuffer`. @@ -421,7 +425,7 @@ object Buffer { * The number of characters to allocate. */ def char(capacity: Int)(implicit trace: Trace): UIO[CharBuffer] = - ZIO.succeed(charFromJava(JCharBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(charFromJava(JCharBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -433,7 +437,7 @@ object Buffer { * The data to copy into the new buffer. */ def char(chunk: Chunk[Char])(implicit trace: Trace): UIO[CharBuffer] = - ZIO.succeed(charFromJava(JCharBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(charFromJava(JCharBuffer.wrap(chunk.toArray))) /** * Creates a read-only character buffer wrapping a character sequence. @@ -454,7 +458,7 @@ object Buffer { start: Int, end: Int )(implicit trace: Trace): UIO[CharBuffer] = - ZIO.succeed(charFromJava(JCharBuffer.wrap(charSequence, start, end))) + Buffer transformError ZIO.succeed(charFromJava(JCharBuffer.wrap(charSequence, start, end))) /** * Creates a read-only character buffer wrapping a character sequence. @@ -465,7 +469,7 @@ object Buffer { * The characters to wrap. */ def char(charSequence: CharSequence)(implicit trace: Trace): UIO[CharBuffer] = - ZIO.succeed(new CharBuffer(JCharBuffer.wrap(charSequence))) + Buffer transformError ZIO.succeed(new CharBuffer(JCharBuffer.wrap(charSequence))) /** * Wraps an existing Java `CharBuffer`. @@ -485,7 +489,7 @@ object Buffer { * The number of floats to allocate. */ def float(capacity: Int)(implicit trace: Trace): UIO[FloatBuffer] = - ZIO.succeed(floatFromJava(JFloatBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(floatFromJava(JFloatBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -497,7 +501,7 @@ object Buffer { * The data to copy into the new buffer. */ def float(chunk: Chunk[Float])(implicit trace: Trace): UIO[FloatBuffer] = - ZIO.succeed(floatFromJava(JFloatBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(floatFromJava(JFloatBuffer.wrap(chunk.toArray))) /** * Wraps an existing Java `FloatBuffer`. @@ -517,7 +521,7 @@ object Buffer { * The number of doubles to allocate. */ def double(capacity: Int)(implicit trace: Trace): UIO[DoubleBuffer] = - ZIO.succeed(doubleFromJava(JDoubleBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(doubleFromJava(JDoubleBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -529,7 +533,7 @@ object Buffer { * The data to copy into the new buffer. */ def double(chunk: Chunk[Double])(implicit trace: Trace): UIO[DoubleBuffer] = - ZIO.succeed(doubleFromJava(JDoubleBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(doubleFromJava(JDoubleBuffer.wrap(chunk.toArray))) /** * Wraps an existing Java `DoubleBuffer`. @@ -549,7 +553,7 @@ object Buffer { * The number of ints to allocate. */ def int(capacity: Int)(implicit trace: Trace): UIO[IntBuffer] = - ZIO.succeed(intFromJava(JIntBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(intFromJava(JIntBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -561,7 +565,7 @@ object Buffer { * The data to copy into the new buffer. */ def int(chunk: Chunk[Int])(implicit trace: Trace): UIO[IntBuffer] = - ZIO.succeed(intFromJava(JIntBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(intFromJava(JIntBuffer.wrap(chunk.toArray))) /** * Wraps an existing Java `IntBuffer`. @@ -581,7 +585,7 @@ object Buffer { * The number of longs to allocate. */ def long(capacity: Int)(implicit trace: Trace): UIO[LongBuffer] = - ZIO.succeed(longFromJava(JLongBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(longFromJava(JLongBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -593,7 +597,7 @@ object Buffer { * The data to copy into the new buffer. */ def long(chunk: Chunk[Long])(implicit trace: Trace): UIO[LongBuffer] = - ZIO.succeed(longFromJava(JLongBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(longFromJava(JLongBuffer.wrap(chunk.toArray))) /** * Wraps an existing Java `LongBuffer`. @@ -613,7 +617,7 @@ object Buffer { * The number of shorts to allocate. */ def short(capacity: Int)(implicit trace: Trace): UIO[ShortBuffer] = - ZIO.succeed(shortFromJava(JShortBuffer.allocate(capacity))) + Buffer transformError ZIO.succeed(shortFromJava(JShortBuffer.allocate(capacity))) /** * Creates a new array-backed buffer containing data copied from a chunk. @@ -625,7 +629,7 @@ object Buffer { * The data to copy into the new buffer. */ def short(chunk: Chunk[Short])(implicit trace: Trace): UIO[ShortBuffer] = - ZIO.succeed(shortFromJava(JShortBuffer.wrap(chunk.toArray))) + Buffer transformError ZIO.succeed(shortFromJava(JShortBuffer.wrap(chunk.toArray))) /** * Wraps an existing Java `ShortBuffer`. diff --git a/nio/src/main/scala/zio/nio/ByteBuffer.scala b/nio/shared/src/main/scala/zio/nio/ByteBuffer.scala similarity index 99% rename from nio/src/main/scala/zio/nio/ByteBuffer.scala rename to nio/shared/src/main/scala/zio/nio/ByteBuffer.scala index bd0602bf..1b9ab8cf 100644 --- a/nio/src/main/scala/zio/nio/ByteBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/ByteBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteBuffer => JByteBuffer, ByteOrder} diff --git a/nio/src/main/scala/zio/nio/CharBuffer.scala b/nio/shared/src/main/scala/zio/nio/CharBuffer.scala similarity index 97% rename from nio/src/main/scala/zio/nio/CharBuffer.scala rename to nio/shared/src/main/scala/zio/nio/CharBuffer.scala index f69aca8d..8f79468b 100644 --- a/nio/src/main/scala/zio/nio/CharBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/CharBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteOrder, CharBuffer => JCharBuffer} diff --git a/nio/src/main/scala/zio/nio/DoubleBuffer.scala b/nio/shared/src/main/scala/zio/nio/DoubleBuffer.scala similarity index 97% rename from nio/src/main/scala/zio/nio/DoubleBuffer.scala rename to nio/shared/src/main/scala/zio/nio/DoubleBuffer.scala index ac3f4f4e..2384ab8e 100644 --- a/nio/src/main/scala/zio/nio/DoubleBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/DoubleBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteOrder, DoubleBuffer => JDoubleBuffer} diff --git a/nio/src/main/scala/zio/nio/FloatBuffer.scala b/nio/shared/src/main/scala/zio/nio/FloatBuffer.scala similarity index 97% rename from nio/src/main/scala/zio/nio/FloatBuffer.scala rename to nio/shared/src/main/scala/zio/nio/FloatBuffer.scala index 46f52811..a3e62292 100644 --- a/nio/src/main/scala/zio/nio/FloatBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/FloatBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteOrder, FloatBuffer => JFloatBuffer} diff --git a/nio/src/main/scala/zio/nio/IOCloseable.scala b/nio/shared/src/main/scala/zio/nio/IOCloseable.scala similarity index 82% rename from nio/src/main/scala/zio/nio/IOCloseable.scala rename to nio/shared/src/main/scala/zio/nio/IOCloseable.scala index 8de681ef..e00480a9 100644 --- a/nio/src/main/scala/zio/nio/IOCloseable.scala +++ b/nio/shared/src/main/scala/zio/nio/IOCloseable.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{IO, Trace} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/InetAddress.scala b/nio/shared/src/main/scala/zio/nio/InetAddress.scala similarity index 98% rename from nio/src/main/scala/zio/nio/InetAddress.scala rename to nio/shared/src/main/scala/zio/nio/InetAddress.scala index d2df19a3..bba2f954 100644 --- a/nio/src/main/scala/zio/nio/InetAddress.scala +++ b/nio/shared/src/main/scala/zio/nio/InetAddress.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, IO, Trace, ZIO} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/InetSocketAddress.scala b/nio/shared/src/main/scala/zio/nio/InetSocketAddress.scala similarity index 99% rename from nio/src/main/scala/zio/nio/InetSocketAddress.scala rename to nio/shared/src/main/scala/zio/nio/InetSocketAddress.scala index ae55cca2..5f2c06a7 100644 --- a/nio/src/main/scala/zio/nio/InetSocketAddress.scala +++ b/nio/shared/src/main/scala/zio/nio/InetSocketAddress.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{IO, Trace, UIO, ZIO} import java.net.{InetSocketAddress => JInetSocketAddress, SocketAddress => JSocketAddress, UnknownHostException} diff --git a/nio/src/main/scala/zio/nio/IntBuffer.scala b/nio/shared/src/main/scala/zio/nio/IntBuffer.scala similarity index 97% rename from nio/src/main/scala/zio/nio/IntBuffer.scala rename to nio/shared/src/main/scala/zio/nio/IntBuffer.scala index 2835799a..f001e676 100644 --- a/nio/src/main/scala/zio/nio/IntBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/IntBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteOrder, IntBuffer => JIntBuffer} diff --git a/nio/src/main/scala/zio/nio/InterfaceAddress.scala b/nio/shared/src/main/scala/zio/nio/InterfaceAddress.scala similarity index 87% rename from nio/src/main/scala/zio/nio/InterfaceAddress.scala rename to nio/shared/src/main/scala/zio/nio/InterfaceAddress.scala index e039e4fc..e7ea84a2 100644 --- a/nio/src/main/scala/zio/nio/InterfaceAddress.scala +++ b/nio/shared/src/main/scala/zio/nio/InterfaceAddress.scala @@ -1,7 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace - import java.net.{InterfaceAddress => JInterfaceAddress} final class InterfaceAddress private[nio] (private val jInterfaceAddress: JInterfaceAddress) { diff --git a/nio/src/main/scala/zio/nio/LongBuffer.scala b/nio/shared/src/main/scala/zio/nio/LongBuffer.scala similarity index 97% rename from nio/src/main/scala/zio/nio/LongBuffer.scala rename to nio/shared/src/main/scala/zio/nio/LongBuffer.scala index 70a82a32..347b3e46 100644 --- a/nio/src/main/scala/zio/nio/LongBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/LongBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteOrder, LongBuffer => JLongBuffer} diff --git a/nio/src/main/scala/zio/nio/MappedByteBuffer.scala b/nio/shared/src/main/scala/zio/nio/MappedByteBuffer.scala similarity index 91% rename from nio/src/main/scala/zio/nio/MappedByteBuffer.scala rename to nio/shared/src/main/scala/zio/nio/MappedByteBuffer.scala index 258540e9..07e31049 100644 --- a/nio/src/main/scala/zio/nio/MappedByteBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/MappedByteBuffer.scala @@ -1,7 +1,6 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.{IO, Trace, UIO, ZIO} +import zio.{UIO, Trace, ZIO} import java.nio.{MappedByteBuffer => JMappedByteBuffer} diff --git a/nio/src/main/scala/zio/nio/NetworkInterface.scala b/nio/shared/src/main/scala/zio/nio/NetworkInterface.scala similarity index 94% rename from nio/src/main/scala/zio/nio/NetworkInterface.scala rename to nio/shared/src/main/scala/zio/nio/NetworkInterface.scala index 005b03bd..d8d7f85f 100644 --- a/nio/src/main/scala/zio/nio/NetworkInterface.scala +++ b/nio/shared/src/main/scala/zio/nio/NetworkInterface.scala @@ -1,24 +1,19 @@ package zio.nio -import com.github.ghik.silencer.silent -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{IO, Trace, ZIO} import java.net.{NetworkInterface => JNetworkInterface, SocketException} -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ class NetworkInterface private[nio] (private[nio] val jNetworkInterface: JNetworkInterface) { def name: String = jNetworkInterface.getName - @silent def inetAddresses: List[InetAddress] = jNetworkInterface.getInetAddresses.asScala.map(new InetAddress(_)).toList - @silent def interfaceAddresses: List[InterfaceAddress] = jNetworkInterface.getInterfaceAddresses.asScala.map(new InterfaceAddress(_)).toList - @silent def subInterfaces: Iterator[NetworkInterface] = jNetworkInterface.getSubInterfaces.asScala.map(new NetworkInterface(_)) @@ -69,7 +64,6 @@ object NetworkInterface { .refineToOrDie[SocketException] .map(new NetworkInterface(_)) - @silent def networkInterfaces(implicit trace: Trace): IO[SocketException, Iterator[NetworkInterface]] = ZIO .attempt(JNetworkInterface.getNetworkInterfaces.asScala) diff --git a/nio/src/main/scala/zio/nio/ShortBuffer.scala b/nio/shared/src/main/scala/zio/nio/ShortBuffer.scala similarity index 97% rename from nio/src/main/scala/zio/nio/ShortBuffer.scala rename to nio/shared/src/main/scala/zio/nio/ShortBuffer.scala index 5f6e52e4..c169303d 100644 --- a/nio/src/main/scala/zio/nio/ShortBuffer.scala +++ b/nio/shared/src/main/scala/zio/nio/ShortBuffer.scala @@ -1,6 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, UIO, ZIO} import java.nio.{ByteOrder, ShortBuffer => JShortBuffer} diff --git a/nio/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala b/nio/shared/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala similarity index 97% rename from nio/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala rename to nio/shared/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala index a10544c7..9f3dd4e7 100644 --- a/nio/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala +++ b/nio/shared/src/main/scala/zio/nio/channels/AsynchronousChannelGroup.scala @@ -1,7 +1,6 @@ package zio.nio.channels import zio._ -import zio.stacktracer.TracingImplicits.disableAutoTrace import java.io.IOException import java.nio.channels.spi.{AsynchronousChannelProvider => JAsynchronousChannelProvider} diff --git a/nio/src/main/scala/zio/nio/channels/Channel.scala b/nio/shared/src/main/scala/zio/nio/channels/Channel.scala similarity index 96% rename from nio/src/main/scala/zio/nio/channels/Channel.scala rename to nio/shared/src/main/scala/zio/nio/channels/Channel.scala index f109ad2d..52f31a15 100644 --- a/nio/src/main/scala/zio/nio/channels/Channel.scala +++ b/nio/shared/src/main/scala/zio/nio/channels/Channel.scala @@ -1,7 +1,7 @@ package zio.nio.channels import zio.ZIO.blocking import zio.nio.IOCloseable -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{IO, Trace, UIO, ZIO} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/channels/FileChannel.scala b/nio/shared/src/main/scala/zio/nio/channels/FileChannel.scala similarity index 98% rename from nio/src/main/scala/zio/nio/channels/FileChannel.scala rename to nio/shared/src/main/scala/zio/nio/channels/FileChannel.scala index 64082a3e..5083742d 100644 --- a/nio/src/main/scala/zio/nio/channels/FileChannel.scala +++ b/nio/shared/src/main/scala/zio/nio/channels/FileChannel.scala @@ -1,9 +1,8 @@ package zio.nio.channels -import com.github.ghik.silencer.silent import zio.nio.file.Path import zio.nio.{ByteBuffer, IOCloseableManagement, MappedByteBuffer} -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{IO, Scope, Trace, ZIO} import java.io.IOException @@ -227,7 +226,6 @@ object FileChannel { * @param attrs * An optional list of file attributes to set atomically when creating the file */ - @silent("object JavaConverters in package collection is deprecated") def open( path: Path, options: Set[_ <: OpenOption], diff --git a/nio/src/main/scala/zio/nio/channels/FileLock.scala b/nio/shared/src/main/scala/zio/nio/channels/FileLock.scala similarity index 97% rename from nio/src/main/scala/zio/nio/channels/FileLock.scala rename to nio/shared/src/main/scala/zio/nio/channels/FileLock.scala index 8b590458..15d18190 100644 --- a/nio/src/main/scala/zio/nio/channels/FileLock.scala +++ b/nio/shared/src/main/scala/zio/nio/channels/FileLock.scala @@ -1,6 +1,5 @@ package zio.nio.channels -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{IO, Trace, UIO, ZIO} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/channels/GatheringByteOps.scala b/nio/shared/src/main/scala/zio/nio/channels/GatheringByteOps.scala similarity index 97% rename from nio/src/main/scala/zio/nio/channels/GatheringByteOps.scala rename to nio/shared/src/main/scala/zio/nio/channels/GatheringByteOps.scala index 311ef262..c807fbf4 100644 --- a/nio/src/main/scala/zio/nio/channels/GatheringByteOps.scala +++ b/nio/shared/src/main/scala/zio/nio/channels/GatheringByteOps.scala @@ -1,9 +1,8 @@ package zio.nio.channels import zio._ -import zio.nio.Buffer.byteFromJava import zio.nio.{Buffer, ByteBuffer} -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.stream.{ZSink, ZStream} import java.io.IOException diff --git a/nio/src/main/scala/zio/nio/channels/ScatteringByteOps.scala b/nio/shared/src/main/scala/zio/nio/channels/ScatteringByteOps.scala similarity index 98% rename from nio/src/main/scala/zio/nio/channels/ScatteringByteOps.scala rename to nio/shared/src/main/scala/zio/nio/channels/ScatteringByteOps.scala index d2fcb161..e4ab8b8b 100644 --- a/nio/src/main/scala/zio/nio/channels/ScatteringByteOps.scala +++ b/nio/shared/src/main/scala/zio/nio/channels/ScatteringByteOps.scala @@ -2,7 +2,6 @@ package zio.nio package channels -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.stream.{Stream, ZStream} import zio.{Chunk, IO, Trace, UIO, ZIO} diff --git a/nio/src/main/scala/zio/nio/charset/AutoDetect.scala b/nio/shared/src/main/scala/zio/nio/charset/AutoDetect.scala similarity index 80% rename from nio/src/main/scala/zio/nio/charset/AutoDetect.scala rename to nio/shared/src/main/scala/zio/nio/charset/AutoDetect.scala index 9019c32e..f072a748 100644 --- a/nio/src/main/scala/zio/nio/charset/AutoDetect.scala +++ b/nio/shared/src/main/scala/zio/nio/charset/AutoDetect.scala @@ -1,5 +1,5 @@ package zio.nio.charset -import zio.stacktracer.TracingImplicits.disableAutoTrace + sealed abstract class AutoDetect object AutoDetect { diff --git a/nio/src/main/scala/zio/nio/charset/Charset.scala b/nio/shared/src/main/scala/zio/nio/charset/Charset.scala similarity index 94% rename from nio/src/main/scala/zio/nio/charset/Charset.scala rename to nio/shared/src/main/scala/zio/nio/charset/Charset.scala index a2b5e00b..dd00d3cb 100644 --- a/nio/src/main/scala/zio/nio/charset/Charset.scala +++ b/nio/shared/src/main/scala/zio/nio/charset/Charset.scala @@ -2,16 +2,13 @@ package zio package nio package charset -import com.github.ghik.silencer.silent - import java.nio.charset.IllegalCharsetNameException import java.nio.{charset => j} import java.{util => ju} -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ final class Charset private (val javaCharset: j.Charset) extends Ordered[Charset] { - @silent("object JavaConverters in package collection is deprecated") def aliases: Set[String] = javaCharset.aliases().asScala.toSet def canEncode: Boolean = javaCharset.canEncode @@ -82,9 +79,14 @@ object Charset { def fromJava(javaCharset: j.Charset): Charset = new Charset(javaCharset) - @silent("deprecated") val availableCharsets: Map[String, Charset] = - j.Charset.availableCharsets().asScala.mapValues(new Charset(_)).toMap + j.Charset + .availableCharsets() + .asScala + .map { case (s, charset) => + (s, new Charset(charset)) + } + .toMap val defaultCharset: Charset = fromJava(j.Charset.defaultCharset()) diff --git a/nio/src/main/scala/zio/nio/charset/CharsetDecoder.scala b/nio/shared/src/main/scala/zio/nio/charset/CharsetDecoder.scala similarity index 99% rename from nio/src/main/scala/zio/nio/charset/CharsetDecoder.scala rename to nio/shared/src/main/scala/zio/nio/charset/CharsetDecoder.scala index 6a1c2742..03458d96 100644 --- a/nio/src/main/scala/zio/nio/charset/CharsetDecoder.scala +++ b/nio/shared/src/main/scala/zio/nio/charset/CharsetDecoder.scala @@ -2,7 +2,6 @@ package zio package nio package charset -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.stream.{ZChannel, ZPipeline} import java.nio.charset.{MalformedInputException, UnmappableCharacterException} diff --git a/nio/src/main/scala/zio/nio/charset/CharsetEncoder.scala b/nio/shared/src/main/scala/zio/nio/charset/CharsetEncoder.scala similarity index 99% rename from nio/src/main/scala/zio/nio/charset/CharsetEncoder.scala rename to nio/shared/src/main/scala/zio/nio/charset/CharsetEncoder.scala index c6811eeb..903e2e82 100644 --- a/nio/src/main/scala/zio/nio/charset/CharsetEncoder.scala +++ b/nio/shared/src/main/scala/zio/nio/charset/CharsetEncoder.scala @@ -2,7 +2,6 @@ package zio package nio package charset -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.stream.{ZChannel, ZPipeline} import java.nio.charset.{MalformedInputException, UnmappableCharacterException} diff --git a/nio/src/main/scala/zio/nio/charset/CoderResult.scala b/nio/shared/src/main/scala/zio/nio/charset/CoderResult.scala similarity index 93% rename from nio/src/main/scala/zio/nio/charset/CoderResult.scala rename to nio/shared/src/main/scala/zio/nio/charset/CoderResult.scala index 437d8da9..84e3e156 100644 --- a/nio/src/main/scala/zio/nio/charset/CoderResult.scala +++ b/nio/shared/src/main/scala/zio/nio/charset/CoderResult.scala @@ -2,8 +2,6 @@ package zio package nio package charset -import zio.stacktracer.TracingImplicits.disableAutoTrace - import java.nio.{charset => j} sealed trait CoderResult { diff --git a/nio/src/main/scala/zio/nio/file/FileSystem.scala b/nio/shared/src/main/scala/zio/nio/file/FileSystem.scala similarity index 91% rename from nio/src/main/scala/zio/nio/file/FileSystem.scala rename to nio/shared/src/main/scala/zio/nio/file/FileSystem.scala index 96bdbe80..a412f2c4 100644 --- a/nio/src/main/scala/zio/nio/file/FileSystem.scala +++ b/nio/shared/src/main/scala/zio/nio/file/FileSystem.scala @@ -2,7 +2,7 @@ package zio.nio package file import zio.ZIO.attemptBlockingIO -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.{IO, Scope, Trace, UIO, ZIO} import java.io.IOException @@ -11,7 +11,11 @@ import java.nio.file.attribute.UserPrincipalLookupService import java.nio.{file => jf} import scala.jdk.CollectionConverters._ -final class FileSystem private (private val javaFileSystem: jf.FileSystem) extends IOCloseable { +final class FileSystem private (private val javaFileSystem: jf.FileSystem) + extends IOCloseable + with FileSystemPlatformSpecific { + + override def jFileSystem: jf.FileSystem = javaFileSystem def provider: jf.spi.FileSystemProvider = javaFileSystem.provider() @@ -38,9 +42,6 @@ final class FileSystem private (private val javaFileSystem: jf.FileSystem) exten def getUserPrincipalLookupService: UserPrincipalLookupService = javaFileSystem.getUserPrincipalLookupService - def newWatchService(implicit trace: Trace): ZIO[Scope, IOException, WatchService] = - attemptBlockingIO(WatchService.fromJava(javaFileSystem.newWatchService())).toNioScoped - } object FileSystem { diff --git a/nio/src/main/scala/zio/nio/file/Files.scala b/nio/shared/src/main/scala/zio/nio/file/Files.scala similarity index 96% rename from nio/src/main/scala/zio/nio/file/Files.scala rename to nio/shared/src/main/scala/zio/nio/file/Files.scala index 04eb84c7..60551c39 100644 --- a/nio/src/main/scala/zio/nio/file/Files.scala +++ b/nio/shared/src/main/scala/zio/nio/file/Files.scala @@ -2,8 +2,9 @@ package zio.nio.file import zio.ZIO.attemptBlocking import zio.nio.charset.Charset -import zio.stacktracer.TracingImplicits.disableAutoTrace -import zio.stream.{ZSink, ZStream} +import zio.nio.ZStreamHelper + +import zio.stream.ZStream import zio.{Chunk, Scope, Trace, ZIO} import java.io.IOException @@ -21,9 +22,8 @@ import java.nio.file.{ import java.util.function.BiPredicate import scala.jdk.CollectionConverters._ import scala.reflect._ -import zio.ZIOAspect -object Files { +object Files extends FilesPlatformSpecific { def newDirectoryStream(dir: Path, glob: String = "*")(implicit trace: Trace @@ -134,15 +134,6 @@ object Files { def deleteIfExists(path: Path)(implicit trace: Trace): ZIO[Any, IOException, Boolean] = attemptBlocking(JFiles.deleteIfExists(path.javaPath)).refineToOrDie[IOException] - def deleteRecursive(path: Path)(implicit trace: Trace): ZIO[Any, IOException, Long] = - newDirectoryStream(path).mapZIO { p => - for { - deletedInSubDirectory <- deleteRecursive(p).whenZIO(isDirectory(p)).map(_.getOrElse(0L)) - deletedFile <- deleteIfExists(p).map(if (_) 1 else 0) - } yield deletedInSubDirectory + deletedFile - } - .run(ZSink.sum) <* delete(path) - def copy(source: Path, target: Path, copyOptions: CopyOption*)(implicit trace: Trace ): ZIO[Any, IOException, Unit] = @@ -348,14 +339,14 @@ object Files { def lines(path: Path, charset: Charset = Charset.Standard.utf8)(implicit trace: Trace ): ZStream[Any, IOException, String] = - ZStream + ZStreamHelper .fromJavaStreamScoped( ZIO.fromAutoCloseable(attemptBlocking(JFiles.lines(path.javaPath, charset.javaCharset))) ) .refineToOrDie[IOException] def list(path: Path)(implicit trace: Trace): ZStream[Any, IOException, Path] = - ZStream + ZStreamHelper .fromJavaStreamScoped( ZIO.fromAutoCloseable(attemptBlocking(JFiles.list(path.javaPath))) ) @@ -367,7 +358,7 @@ object Files { maxDepth: Int = Int.MaxValue, visitOptions: Set[FileVisitOption] = Set.empty )(implicit trace: Trace): ZStream[Any, IOException, Path] = - ZStream + ZStreamHelper .fromJavaStreamScoped( ZIO.fromAutoCloseable(attemptBlocking(JFiles.walk(path.javaPath, maxDepth, visitOptions.toSeq: _*))) ) @@ -378,7 +369,7 @@ object Files { test: (Path, BasicFileAttributes) => Boolean )(implicit trace: Trace): ZStream[Any, IOException, Path] = { val matcher: BiPredicate[JPath, BasicFileAttributes] = (path, attr) => test(Path.fromJava(path), attr) - ZStream + ZStreamHelper .fromJavaStreamScoped( ZIO.fromAutoCloseable( attemptBlocking(JFiles.find(path.javaPath, maxDepth, matcher, visitOptions.toSeq: _*)) diff --git a/nio/src/main/scala/zio/nio/file/Path.scala b/nio/shared/src/main/scala/zio/nio/file/Path.scala similarity index 98% rename from nio/src/main/scala/zio/nio/file/Path.scala rename to nio/shared/src/main/scala/zio/nio/file/Path.scala index b7043279..b49312b0 100644 --- a/nio/src/main/scala/zio/nio/file/Path.scala +++ b/nio/shared/src/main/scala/zio/nio/file/Path.scala @@ -1,6 +1,5 @@ package zio.nio.file -import zio.stacktracer.TracingImplicits.disableAutoTrace import zio.{Chunk, Trace, ZIO} import java.io.{File, IOError, IOException} diff --git a/nio/src/main/scala/zio/nio/file/WatchService.scala b/nio/shared/src/main/scala/zio/nio/file/WatchService.scala similarity index 96% rename from nio/src/main/scala/zio/nio/file/WatchService.scala rename to nio/shared/src/main/scala/zio/nio/file/WatchService.scala index 3fa73c9e..1af3d690 100644 --- a/nio/src/main/scala/zio/nio/file/WatchService.scala +++ b/nio/shared/src/main/scala/zio/nio/file/WatchService.scala @@ -2,7 +2,7 @@ package zio.nio.file import zio._ import zio.nio.IOCloseable -import zio.stacktracer.TracingImplicits.disableAutoTrace + import zio.stream.ZStream import java.io.IOException @@ -160,10 +160,7 @@ final class WatchService private (private[file] val javaWatchService: JWatchServ } -object WatchService { - - def forDefaultFileSystem(implicit trace: Trace): ZIO[Scope, IOException, WatchService] = - FileSystem.default.newWatchService +object WatchService extends WatchServicePlatformSpecific { def fromJava(javaWatchService: JWatchService): WatchService = new WatchService(javaWatchService) diff --git a/nio/src/main/scala/zio/nio/file/package.scala b/nio/shared/src/main/scala/zio/nio/file/package.scala similarity index 90% rename from nio/src/main/scala/zio/nio/file/package.scala rename to nio/shared/src/main/scala/zio/nio/file/package.scala index 87951d44..c7f9c1e2 100644 --- a/nio/src/main/scala/zio/nio/file/package.scala +++ b/nio/shared/src/main/scala/zio/nio/file/package.scala @@ -1,7 +1,5 @@ package zio.nio -import zio.stacktracer.TracingImplicits.disableAutoTrace - import java.nio.file.{Path => JPath, WatchEvent} package object file { diff --git a/nio/src/main/scala/zio/nio/package.scala b/nio/shared/src/main/scala/zio/nio/package.scala similarity index 91% rename from nio/src/main/scala/zio/nio/package.scala rename to nio/shared/src/main/scala/zio/nio/package.scala index ce5d4692..e3c1c104 100644 --- a/nio/src/main/scala/zio/nio/package.scala +++ b/nio/shared/src/main/scala/zio/nio/package.scala @@ -1,8 +1,5 @@ package zio -import com.github.ghik.silencer.silent -import zio.stream.{ZChannel, ZPipeline, ZSink, ZStream} - import java.io.EOFException /** @@ -34,7 +31,6 @@ package object nio { * This will catch an `EOFException` failure from the effect and translate it to a failure of `None`. Other * exception types are wrapped in `Some`. */ - @silent("parameter value ev in method .* is never used") def eofCheck[E2 >: E](implicit ev: EOFException <:< E2, trace: Trace): ZIO[R, Option[E2], A] = effect.catchAll { case _: EOFException => ZIO.fail(None) diff --git a/nio/src/test/resources/async_file_read_test.txt b/nio/shared/src/test/resources/async_file_read_test.txt similarity index 100% rename from nio/src/test/resources/async_file_read_test.txt rename to nio/shared/src/test/resources/async_file_read_test.txt diff --git a/nio/src/test/resources/scattering_read_test.txt b/nio/shared/src/test/resources/scattering_read_test.txt similarity index 100% rename from nio/src/test/resources/scattering_read_test.txt rename to nio/shared/src/test/resources/scattering_read_test.txt diff --git a/nio/src/test/scala/zio/nio/BaseSpec.scala b/nio/shared/src/test/scala/zio/nio/BaseSpec.scala similarity index 100% rename from nio/src/test/scala/zio/nio/BaseSpec.scala rename to nio/shared/src/test/scala/zio/nio/BaseSpec.scala diff --git a/nio/src/test/scala/zio/nio/BufferSpec.scala b/nio/shared/src/test/scala/zio/nio/BufferSpec.scala similarity index 100% rename from nio/src/test/scala/zio/nio/BufferSpec.scala rename to nio/shared/src/test/scala/zio/nio/BufferSpec.scala diff --git a/nio/shared/src/test/scala/zio/nio/channels/ChannelSpec.scala b/nio/shared/src/test/scala/zio/nio/channels/ChannelSpec.scala new file mode 100644 index 00000000..bb69b7c0 --- /dev/null +++ b/nio/shared/src/test/scala/zio/nio/channels/ChannelSpec.scala @@ -0,0 +1,27 @@ +package zio.nio.channels + +import zio._ +import zio.nio.{BaseSpec, EffectOps} +import zio.test.Assertion._ +import zio.test._ + +import java.io.{EOFException, FileNotFoundException, IOException} + +object ChannelSpec extends BaseSpec { + + override def spec = + suite("Channel")( + suite("explicit end-of-stream")( + test("converts EOFException to None") { + assertZIO(ZIO.fail(new EOFException).eofCheck.exit)(fails(isNone)) + }, + test("converts non EOFException to Some") { + val e: IOException = new FileNotFoundException() + assertZIO(ZIO.fail(e).eofCheck.exit)(fails(isSome(equalTo(e)))) + }, + test("passes through success") { + assertZIO(ZIO.succeed(42).eofCheck.exit)(succeeds(equalTo(42))) + } + ) + ) +} diff --git a/nio/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala b/nio/shared/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala similarity index 89% rename from nio/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala rename to nio/shared/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala index 65cdd271..50ecad6f 100644 --- a/nio/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala +++ b/nio/shared/src/test/scala/zio/nio/channels/ScatterGatherChannelSpec.scala @@ -4,7 +4,7 @@ import zio.nio.file.Path import zio.nio.{BaseSpec, Buffer} import zio.test.Assertion._ import zio.test._ -import zio.{Chunk, IO, Scope, ZIO} +import zio.{Chunk, Scope, ZIO} import java.io.IOException import java.nio.file.{Files, StandardOpenOption} @@ -16,7 +16,7 @@ object ScatterGatherChannelSpec extends BaseSpec { suite("ScatterGatherChannelSpec")( test("scattering read") { FileChannel - .open(Path("nio/src/test/resources/scattering_read_test.txt"), StandardOpenOption.READ) + .open(Path("nio/shared/src/test/resources/scattering_read_test.txt"), StandardOpenOption.READ) .flatMapNioBlockingOps { ops => for { buffs <- ZIO.collectAll(List(Buffer.byte(5), Buffer.byte(5))) @@ -33,7 +33,7 @@ object ScatterGatherChannelSpec extends BaseSpec { } }, test("gathering write") { - val file = Path("nio/src/test/resources/gathering_write_test.txt") + val file = Path("nio/shared/src/test/resources/gathering_write_test.txt") FileChannel .open(file, StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING) .flatMapNioBlockingOps { ops => diff --git a/nio/src/test/scala/zio/nio/charset/CharsetSpec.scala b/nio/shared/src/test/scala/zio/nio/charset/CharsetSpec.scala similarity index 100% rename from nio/src/test/scala/zio/nio/charset/CharsetSpec.scala rename to nio/shared/src/test/scala/zio/nio/charset/CharsetSpec.scala diff --git a/nio/src/test/scala/zio/nio/file/FilesSpec.scala b/nio/shared/src/test/scala/zio/nio/file/FilesSpec.scala similarity index 93% rename from nio/src/test/scala/zio/nio/file/FilesSpec.scala rename to nio/shared/src/test/scala/zio/nio/file/FilesSpec.scala index a7c17b04..46f76d9c 100644 --- a/nio/src/test/scala/zio/nio/file/FilesSpec.scala +++ b/nio/shared/src/test/scala/zio/nio/file/FilesSpec.scala @@ -84,10 +84,11 @@ object FilesSpec extends BaseSpec { }, test("deleteRecursive deletes subdirectories") { for { - outerDir <- Files.createTempDirectory(prefix = None, fileAttributes = Nil) - innerDir = outerDir / "inner" - _ <- Files.createDirectory(innerDir) - innerDir <- Files.writeLines(innerDir / "file.txt", "test" :: Nil) + outerDir <- Files.createTempDirectory(prefix = None, fileAttributes = Nil) + innerDir = outerDir / "inner" + _ <- Files.createDirectory(innerDir) + //innerDir <- Files.writeLines(innerDir / "file.txt", "test" :: Nil) + _ <- Files.writeLines(innerDir / "file.txt", "test" :: Nil) _ <- Files.deleteRecursive(outerDir) isDeleted <- Files.notExists(outerDir) } yield assertTrue(isDeleted) diff --git a/nio/src/test/scala/zio/nio/file/PathSpec.scala b/nio/shared/src/test/scala/zio/nio/file/PathSpec.scala similarity index 94% rename from nio/src/test/scala/zio/nio/file/PathSpec.scala rename to nio/shared/src/test/scala/zio/nio/file/PathSpec.scala index 4781f213..9966219f 100644 --- a/nio/src/test/scala/zio/nio/file/PathSpec.scala +++ b/nio/shared/src/test/scala/zio/nio/file/PathSpec.scala @@ -3,7 +3,7 @@ package zio.nio.file import zio.nio.BaseSpec import zio.test.Assertion._ import zio.test._ -import zio.{Scope, ZIOAppArgs} +import zio.Scope object PathSpec extends BaseSpec { diff --git a/project/BuildHelper.scala b/project/BuildHelper.scala index 0e6ffa40..10f7570c 100644 --- a/project/BuildHelper.scala +++ b/project/BuildHelper.scala @@ -22,11 +22,10 @@ object BuildHelper { val vs = v.split('.'); val init = vs.take(vs(0) match { case "2" => 2; case _ => 1 }); (init.mkString("."), v) }.toMap } - val Scala211: String = versions("2.11") + val Scala212: String = versions("2.12") val Scala213: String = versions("2.13") val Scala3: String = versions("3") - val SilencerVersion = "1.7.12" private val stdOptions = Seq( "-deprecation", @@ -92,6 +91,25 @@ object BuildHelper { } ) + lazy val crossProjectSettings = Seq( + Compile / unmanagedSourceDirectories ++= { + crossPlatformSources( + scalaVersion.value, + crossProjectPlatform.value.identifier, + "main", + baseDirectory.value + ) + }, + Test / unmanagedSourceDirectories ++= { + crossPlatformSources( + scalaVersion.value, + crossProjectPlatform.value.identifier, + "test", + baseDirectory.value + ) + } + ) + def makeReplSettings(initialCommandsStr: String) = Seq( // In the repl most warnings are useless or worse. @@ -183,33 +201,11 @@ object BuildHelper { def stdSettings(prjName: String) = Seq( name := s"$prjName", - crossScalaVersions := Seq(Scala211, Scala212, Scala213), + crossScalaVersions := Seq(Scala212, Scala213), ThisBuild / scalaVersion := Scala213, scalacOptions := stdOptions ++ extraOptions(scalaVersion.value, optimize = !isSnapshot.value), - libraryDependencies ++= { - if (scalaVersion.value == Scala3) - Seq( - "com.github.ghik" % s"silencer-lib_$Scala213" % SilencerVersion % Provided - ) - else - Seq( - ("com.github.ghik" % "silencer-lib" % SilencerVersion % Provided).cross(CrossVersion.full), - compilerPlugin(("com.github.ghik" % "silencer-plugin" % SilencerVersion).cross(CrossVersion.full)), - compilerPlugin(("org.typelevel" %% "kind-projector" % "0.13.2").cross(CrossVersion.full)) - ) - }, - semanticdbEnabled := scalaVersion.value != Scala3, // enable SemanticDB - semanticdbOptions += "-P:semanticdb:synthetics:on", - semanticdbVersion := scalafixSemanticdb.revision, // use Scalafix compatible version - ThisBuild / scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), - ThisBuild / scalafixDependencies ++= List( - "com.github.liancheng" %% "organize-imports" % "0.6.0", - "com.github.vovapolu" %% "scaluzzi" % "0.1.20" - ), Test / parallelExecution := true, - incOptions ~= (_.withLogRecompileOnMacro(false)), - autoAPIMappings := true, - unusedCompileDependenciesFilter -= moduleFilter("org.scala-js", "scalajs-library") + incOptions ~= (_.withLogRecompileOnMacro(false)) ) def welcomeMessage = diff --git a/project/plugins.sbt b/project/plugins.sbt index f0875752..7b8777e8 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,5 +1,5 @@ addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") -addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.10.4") +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.11.0") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.3") addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.11") @@ -10,7 +10,7 @@ addSbtPlugin("de.heikoseeberger" % "sbt-header" addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.2.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") -addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.9") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.12") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.24") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.6")