Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
aebeaa0
Fix .jvmopts for modern JDKs by removing unsupported CMSClassUnloadin…
halotukozak Feb 24, 2026
c55330d
Bump sbt to 1.10.7
halotukozak Feb 24, 2026
b7c6bf5
Bump sbt-scoverage to 2.3.1 to resolve scala-xml conflict
halotukozak Feb 24, 2026
3e83f14
Bump sbt-scalajs to 1.18.2
halotukozak Feb 24, 2026
d9a9cbd
Bump sbt-unidoc to 0.5.0 (org change to com.github.sbt)
halotukozak Feb 24, 2026
65a0106
Bump sbt-jmh to 0.4.7
halotukozak Feb 24, 2026
c1d3daa
Bump sbt-mima-plugin to 1.1.4
halotukozak Feb 24, 2026
85cb483
Bump sbt-header to 5.10.0
halotukozak Feb 24, 2026
031d577
Bump sbt-scalafmt to 2.5.4
halotukozak Feb 24, 2026
807251c
Bump sbt-assembly to 2.3.1
halotukozak Feb 24, 2026
9da2412
Bump sbt-reproducible-builds to 0.32
halotukozak Feb 24, 2026
b1d55b8
Bump sbt-dynver to 5.1.0 (org change to com.github.sbt)
halotukozak Feb 24, 2026
0f8710a
Bump sbt-git to 2.1.0 (org change to com.github.sbt)
halotukozak Feb 24, 2026
d365e23
Bump sbt-sonatype to 3.12.2
halotukozak Feb 24, 2026
911ea97
Bump sbt-pgp to 2.3.1
halotukozak Feb 24, 2026
f395995
Add libraryDependencySchemes for geny to resolve meta-build conflict
halotukozak Feb 24, 2026
6aeefdf
Fix geny version conflict using VersionScheme.Always
halotukozak Feb 24, 2026
45d359d
Update Scala versions to 2.12.20, 2.13.16, 3.3.5
halotukozak Feb 24, 2026
0c9251f
Fix Scala 2.13.16 compatibility and build configuration
halotukozak Feb 24, 2026
cb4aebe
Clarify Task.start/startAndForget stack tracing behavior
halotukozak Feb 25, 2026
b6440ef
feat(01-infrastructure-modernization-01): migrate sbt-tpolecat to org…
halotukozak Feb 25, 2026
da27598
docs(01-infrastructure-modernization-01): complete sbt-tpolecat migra…
halotukozak Feb 25, 2026
7465e7b
fix(01-02): add -Wconf suppressions and fix Scala 3 value-discard errors
halotukozak Feb 25, 2026
294f64c
fix(01-02): disable tpolecat test-time warnings for pre-existing patt…
halotukozak Feb 25, 2026
07bfa7f
docs(01-02): complete cross-compile verification plan
halotukozak Feb 26, 2026
cdb46e3
Remove .planning from git and add to .gitignore
halotukozak Feb 26, 2026
0ecf74e
some reverts
halotukozak Feb 26, 2026
f7e09ea
Address PR review feedback from mikkolaj
halotukozak Mar 23, 2026
42ba07d
Align formatting in `plugins.sbt` and remove unused scalacOptions
halotukozak Mar 25, 2026
f5ac711
Improve null-check error messages in ReactivePublisher and ReactiveSu…
halotukozak Mar 26, 2026
94d7fe8
Refactor operators to explicitly define Scheduler type for implicit v…
halotukozak Mar 26, 2026
0e77a08
Refactor test suites to explicitly import `Scheduler` where needed.
halotukozak Mar 26, 2026
4caee57
Merge branch 'series/3.x-avs' into bump-dependencies
halotukozak Mar 26, 2026
3d234b3
fix: add return type to `Eq` instance in test suite
halotukozak Mar 26, 2026
896756b
fix: add explicit Scheduler type annotation to AbstractBackPressuredB…
halotukozak Mar 26, 2026
689d308
Merge remote-tracking branch 'origin/drop-jdk-8-support-ci' into bump…
halotukozak Mar 26, 2026
07c6184
Merge branch 'series/3.x-avs' into bump-dependencies
halotukozak Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ name: build

on:
pull_request:
branches: ['series/*']
branches: [ 'series/*' ]
push:
branches: ['series/*']
tags: ["v[0-9]+*"]
branches: [ 'series/*' ]
tags: [ "v[0-9]+*" ]

jobs:
jvm-tests:
Expand All @@ -17,7 +17,7 @@ jobs:
java: [ 11 ]
# WARN: build.sbt depends on this key path, as scalaVersion and
# crossScalaVersions is determined from it
scala: [ 2.13.8, 3.1.2 ]
scala: [ 2.13.18, 3.3.7 ]

env:
CI: true
Expand Down Expand Up @@ -65,8 +65,8 @@ jobs:
# WARN: build.sbt depends on this key path, as scalaVersion and
# crossScalaVersions is determined from it
include:
- { java: 11, scala: 2.13.8 }
- { java: 11, scala: 3.1.2 }
- { java: 11, scala: 2.13.18 }
- { java: 11, scala: 3.3.7 }

env:
CI: true
Expand Down Expand Up @@ -118,8 +118,8 @@ jobs:
fail-fast: false
matrix:
include:
- { java: 11, scala: 2.13.8 }
- { java: 11, scala: 3.1.2 }
- { java: 11, scala: 2.13.18 }
- { java: 11, scala: 3.3.7 }

steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -162,9 +162,9 @@ jobs:
fail-fast: false
matrix:
include:
- { java: 11, scala: 2.13.8 }
- { java: 11, scala: 2.13.18 }
# TODO: enable this after it works!
# - { java: 11, scala: 3.1.2 }
# - { java: 11, scala: 3.3.5 }

steps:
- uses: actions/checkout@v4
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ TAGS
metals.sbt
.vscode
.bsp
.planning/
1 change: 0 additions & 1 deletion .jvmopts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@
-XX:ReservedCodeCacheSize=250M
-XX:+TieredCompilation
-XX:-UseGCOverheadLimit
-XX:+CMSClassUnloadingEnabled

22 changes: 18 additions & 4 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import sbt.{ Def, Global, Tags }

import scala.collection.immutable.SortedSet
import MonixBuildUtils._
import org.typelevel.scalacoptions.ScalacOptions

val benchmarkProjects = List(
"benchmarksPrev",
Expand Down Expand Up @@ -31,9 +32,9 @@ val reactiveStreams_Version = "1.0.4"
val macrotaskExecutor_Version = "1.0.0"
val minitest_Version = "2.9.6"
val implicitBox_Version = "0.3.4"
val kindProjector_Version = "0.13.2"
val kindProjector_Version = "0.13.4"
val betterMonadicFor_Version = "0.3.1"
val silencer_Version = "1.7.8"
val silencer_Version = "1.7.19"
val scalaCompat_Version = "2.7.0"

// The Monix version with which we must keep binary compatibility.
Expand Down Expand Up @@ -189,8 +190,19 @@ lazy val sharedSettings = pgpSettings ++ Seq(
"-Wunused:explicits",
"-Ywarn-unused:params",
"-Wunused:params",
"-Xlint:infer-any"
"-Xlint:infer-any",
"-Wnonunit-statement"
),
// Disabled from tpolecat for test compilation:
// -Wunused:patvars triggers on for-comprehension loop vars in tests (pre-existing pattern)
// -Xlint:constant triggers on intentional overflow tests (e.g. Long.MaxValue + 1)
Test / scalacOptions --= {
CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, 13)) => Seq("-Wunused:patvars", "-Xlint:constant")
case Some((2, 12)) => Seq("-Ywarn-unused:patvars")
case _ => Seq.empty
}
},
// Turning off fatal warnings for doc generation
Compile / doc / tpolecatExcludeOptions ++= ScalacOptions.defaultConsoleExclude,
// Silence everything in auto-generated files
Expand All @@ -202,7 +214,9 @@ lazy val sharedSettings = pgpSettings ++ Seq(
},
scalacOptions --= {
if (isDotty.value)
Seq("-Xfatal-warnings")
// tpolecat uses -Werror in Scala 3; disable fatal warnings
// so that pre-existing value-discard and similar patterns don't break Scala 3 builds
Seq("-Werror")
else
Seq()
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ object TypeClassLawsForCancelableFutureSuite extends BaseLawsSuite {
}

test("adaptError") {
implicit val ec = TestScheduler()
implicit val ec: TestScheduler = TestScheduler()
val F = MonadError[CancelableFuture, Throwable]

val fa1 = F.catchNonFatal(1); ec.tick()
Expand All @@ -45,7 +45,7 @@ object TypeClassLawsForCancelableFutureSuite extends BaseLawsSuite {
}

test("adaptErrorEval") {
implicit val ec = TestScheduler()
implicit val ec: TestScheduler = TestScheduler()
val F = MonadError[CancelableFuture, Throwable]

val fa1 = F.catchNonFatalEval(Eval.always(1)); ec.tick()
Expand All @@ -57,7 +57,7 @@ object TypeClassLawsForCancelableFutureSuite extends BaseLawsSuite {
}

test("flatMap should be stack safe") {
implicit val s = TestScheduler()
implicit val s: TestScheduler = TestScheduler()
val n = 100000
val M = Monad[CancelableFuture]
val f = M.tailRecM(0)(i => M.pure(if (i < n) Left(i + 1) else Right(i)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class BaseTypeClassLawsForTaskWithCallbackSuite(implicit opts: Task.Options) ext
implicit
A: Eq[A],
ec: TestScheduler,
opts: Options) = {
opts: Options): Eq[Task[A]] = {

Eq.by { task =>
val p = Promise[A]()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@

package monix.reactive.observers.buffers

import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.execution.internal.collection.JSArrayQueue
import monix.execution.internal.math.nextPowerOf2

import scala.util.control.NonFatal
import monix.reactive.observers.{BufferedSubscriber, Subscriber}

Expand All @@ -37,7 +38,7 @@ private[observers] abstract class AbstractBackPressuredBufferedSubscriber[A, R](
private[this] val bufferSize = nextPowerOf2(_size)

private[this] val em = out.scheduler.executionModel
implicit final val scheduler = out.scheduler
implicit final val scheduler: Scheduler = out.scheduler

private[this] var upstreamIsComplete = false
private[this] var downstreamIsComplete = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
package monix.reactive.observers.buffers

import monix.eval.Coeval
import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.execution.internal.collection.{JSArrayQueue, _}

Expand All @@ -38,7 +38,7 @@ private[observers] final class SyncBufferedSubscriber[-A] private (
onOverflow: Long => Coeval[Option[A]] = null)
extends BufferedSubscriber[A] with Subscriber.Sync[A] {

implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler
// to be modified only in onError, before upstreamIsComplete
private[this] var errorThrown: Throwable = _
// to be modified only in onError / onComplete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@
package monix.reactive.compression.internal.operators

import java.util.zip.Deflater

import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.Continue
import monix.reactive.Observable.Operator
import monix.reactive.compression.{CompressionLevel, CompressionParameters, CompressionStrategy, FlushMode}
Expand All @@ -36,7 +35,7 @@ private[compression] final class DeflateOperator(
) extends Operator[Array[Byte], Array[Byte]] {
override def apply(out: Subscriber[Array[Byte]]): Subscriber[Array[Byte]] = {
new Subscriber[Array[Byte]] {
implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler

private[this] var ack: Future[Ack] = Continue
private[this] val deflate =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,11 @@ package monix.reactive.compression.internal.operators

import java.util.zip.{CRC32, DataFormatException, Inflater}
import java.{util => ju}

import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.reactive.Observable.Operator
import monix.reactive.compression.internal.operators.Gunzipper._
import monix.reactive.compression.{
gzipCompressionMethod,
gzipFlag,
gzipMagicFirstByte,
gzipMagicSecondByte,
CompressionException
}
import monix.reactive.compression.{CompressionException, gzipCompressionMethod, gzipFlag, gzipMagicFirstByte, gzipMagicSecondByte}
import monix.reactive.observers.Subscriber

import scala.annotation.tailrec
Expand All @@ -42,7 +35,7 @@ private[compression] final class GunzipOperator(bufferSize: Int) extends Operato

def apply(out: Subscriber[Array[Byte]]): Subscriber[Array[Byte]] =
new Subscriber[Array[Byte]] {
implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler

private[this] var isDone = false
private[this] var ack: Future[Ack] = _
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,11 @@ package monix.reactive.compression.internal.operators
import java.nio.charset.StandardCharsets
import java.time.Instant
import java.util.zip.{CRC32, Deflater}

import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.Continue
import monix.reactive.Observable.Operator
import monix.reactive.compression.internal.operators.Gzipper.gzipOperatingSystem
import monix.reactive.compression.{
gzipCompressionMethod,
gzipExtraFlag,
gzipFlag,
gzipMagicFirstByte,
gzipMagicSecondByte,
zeroByte,
CompressionLevel,
CompressionParameters,
CompressionStrategy,
FlushMode
}
import monix.reactive.compression.{CompressionLevel, CompressionParameters, CompressionStrategy, FlushMode, gzipCompressionMethod, gzipExtraFlag, gzipFlag, gzipMagicFirstByte, gzipMagicSecondByte, zeroByte}
import monix.reactive.observers.Subscriber

import scala.concurrent.Future
Expand All @@ -52,7 +40,7 @@ private[compression] final class GzipOperator(
) extends Operator[Array[Byte], Array[Byte]] {
override def apply(out: Subscriber[Array[Byte]]): Subscriber[Array[Byte]] = {
new Subscriber[Array[Byte]] {
implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler

private[this] var ack: Future[Ack] = _
private[this] val gzipper =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ package monix.reactive.compression.internal.operators

import java.util.zip.{DataFormatException, Inflater}
import java.{util => ju}

import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.reactive.Observable.Operator
import monix.reactive.compression.CompressionException
Expand All @@ -36,7 +35,7 @@ private[compression] final class InflateOperator(bufferSize: Int, noWrap: Boolea

def apply(out: Subscriber[Array[Byte]]): Subscriber[Array[Byte]] =
new Subscriber[Array[Byte]] {
implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler

private[this] var isDone = false
private[this] var ack: Future[Ack] = _
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@

package monix.reactive.observers.buffers

import monix.execution.{Ack, ChannelType}
import monix.execution.{Ack, ChannelType, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.execution.BufferCapacity.Unbounded
import monix.execution.ChannelType._
import monix.execution.atomic.Atomic
import monix.execution.atomic.PaddingStrategy.LeftRight256
import monix.execution.internal.collection.LowLevelConcurrentQueue
import monix.execution.internal.{math, Platform}
import monix.execution.internal.{Platform, math}

import scala.util.control.NonFatal
import monix.reactive.observers.{BufferedSubscriber, Subscriber}
Expand All @@ -46,7 +46,7 @@ private[observers] abstract class AbstractBackPressuredBufferedSubscriber[A, R](

private[this] val bufferSize = math.nextPowerOf2(_bufferSize)
private[this] val em = out.scheduler.executionModel
implicit final val scheduler = out.scheduler
implicit final val scheduler: Scheduler = out.scheduler

protected final val queue: LowLevelConcurrentQueue[A] =
LowLevelConcurrentQueue(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
package monix.reactive.observers.buffers

import monix.eval.Coeval
import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.execution.atomic.PaddingStrategy.{LeftRight128, LeftRight256}
import monix.execution.atomic.{Atomic, AtomicInt}
Expand All @@ -42,7 +42,7 @@ private[observers] final class DropNewBufferedSubscriber[A] private (

require(bufferSize > 0, "bufferSize must be a strictly positive number")

implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler
private[this] val em = out.scheduler.executionModel

private[this] val itemsToPush =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
package monix.reactive.observers.buffers

import monix.eval.Coeval
import monix.execution.Ack
import monix.execution.{Ack, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.execution.atomic.PaddingStrategy.{LeftRight128, LeftRight256}
import monix.execution.atomic.{Atomic, AtomicAny, AtomicInt}
Expand Down Expand Up @@ -112,7 +112,7 @@ private[observers] abstract class AbstractEvictingBufferedSubscriber[-A](

require(strategy.bufferSize > 0, "bufferSize must be a strictly positive number")

implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler
private[this] val em = out.scheduler.executionModel

private[this] val droppedCount: AtomicInt =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

package monix.reactive.observers.buffers

import monix.execution.{Ack, ChannelType}
import monix.execution.{Ack, ChannelType, Scheduler}
import monix.execution.Ack.{Continue, Stop}
import monix.execution.BufferCapacity.{Bounded, Unbounded}
import monix.execution.ChannelType.SingleConsumer
Expand Down Expand Up @@ -62,7 +62,7 @@ private[observers] abstract class AbstractSimpleBufferedSubscriber[A] protected

private[this] val queue = _qRef
private[this] val em = out.scheduler.executionModel
implicit val scheduler = out.scheduler
implicit val scheduler: Scheduler = out.scheduler
private[this] val itemsToPush =
Atomic.withPadding(0, LeftRight256)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ abstract class Observable[+A] extends Serializable { self =>
s: Scheduler): Cancelable = {

subscribe(new Subscriber[A] {
implicit val scheduler = s
implicit val scheduler: Scheduler = s

def onNext(elem: A) = nextFn(elem)
def onComplete() = completedFn()
Expand Down
Loading
Loading