Skip to content

Add scalafix configuration #185

New issue

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

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

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
19 changes: 17 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ jobs:
if: github.event_name == 'push'

upload-launchers:
needs: [format, jvm-tests, native-tests, native-static-tests, native-mostly-static-tests]
needs: [format, scalafix, jvm-tests, native-tests, native-static-tests, native-mostly-static-tests]
runs-on: ubuntu-24.04
if: github.event_name == 'push'
steps:
Expand Down Expand Up @@ -178,8 +178,23 @@ jobs:
- uses: VirtusLab/scala-cli-setup@v1
- run: scala-cli fmt . --check

scalafix:
timeout-minutes: 30
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v6
- uses: coursier/setup-action@v1
with:
jvm: temurin:17
- name: Run scalafix
run: ./mill -i __.fix --check

publish:
needs: [format, jvm-tests, native-tests, native-static-tests, native-mostly-static-tests]
needs: [format, scalafix, jvm-tests, native-tests, native-static-tests, native-mostly-static-tests]
if: github.event_name == 'push'
runs-on: ubuntu-24.04
steps:
Expand Down
23 changes: 23 additions & 0 deletions .scalafix.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
rules = [
DisableSyntax,
RemoveUnused,
OrganizeImports,
NoValInForComprehension,
# ProcedureSyntax
]
DisableSyntax.noFinalize = true
DisableSyntax.noIsInstanceOf = true
DisableSyntax.noReturns = true

// `rules` on compilation
triggered.rules = [
DisableSyntax
]

OrganizeImports {
coalesceToWildcardImportThreshold = 6
expandRelative = true
groups = ["*", "re:javax?\\.", "scala."]
groupedImports = AggressiveMerge
targetDialect = Scala3
}
24 changes: 14 additions & 10 deletions build.mill.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import $packages._

import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.31-1`
import $ivy.`io.github.alexarchambault.mill::mill-native-image-upload:0.1.31-1`
import $ivy.`com.goyeau::mill-scalafix::0.5.1`
import build.project.publish,
build.project.publish.{finalPublishVersion, publishSonatype => publishSonatype0}
import io.github.alexarchambault.millnativeimage.NativeImage
Expand All @@ -13,6 +14,7 @@ import scalalib._

import java.io.File
import scala.annotation.unused
import com.goyeau.mill.scalafix.ScalafixModule

object Deps {
object Versions {
Expand Down Expand Up @@ -59,9 +61,14 @@ trait ScalaCliSigningPublish extends PublishModule {
def publishVersion: Target[String] = finalPublishVersion()
}

object shared extends Shared
trait Shared extends ScalaModule with ScalaCliSigningPublish {
trait ScalaCliSigningModule extends ScalaModule with ScalafixModule {
override def scalacOptions: Target[Seq[String]] =
super.scalacOptions.map(_ ++ Seq("-Wunused:all"))
override def scalaVersion: Target[String] = Scala.scala3
}

object shared extends Shared
trait Shared extends ScalaCliSigningModule with ScalaCliSigningPublish {
def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ Seq(
Deps.jsoniterCore,
Deps.osLib
Expand Down Expand Up @@ -100,9 +107,7 @@ trait CliNativeImage extends NativeImage {
}

object cli extends Cli
trait Cli extends ScalaModule with ScalaCliSigningPublish {
self =>
override def scalaVersion: Target[String] = Scala.scala3
trait Cli extends ScalaCliSigningModule with ScalaCliSigningPublish { self =>
def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ Seq(
Deps.bouncycastle,
Deps.bouncycastleUtils,
Expand All @@ -123,10 +128,9 @@ trait Cli extends ScalaModule with ScalaCliSigningPublish {
}
}
}
object `native-cli` extends ScalaModule with ScalaCliSigningPublish { self =>
def scalaVersion: Target[String] = Task(Scala.scala3)
def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ Seq(Deps.svm)
def moduleDeps: Seq[Cli] = Seq(cli)
object `native-cli` extends ScalaCliSigningModule with ScalaCliSigningPublish { self =>
def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ Seq(Deps.svm)
def moduleDeps: Seq[Cli] = Seq(cli)

def mainClass: Target[Option[String]] = cli.mainClass()

Expand Down Expand Up @@ -231,7 +235,7 @@ trait CliTests extends ScalaModule {
}
}

object `jvm-integration` extends JvmIntegration
object `jvm-integration` extends JvmIntegration with ScalafixModule
trait JvmIntegration extends ScalaModule with CliTests { self =>
override def scalaVersion: Target[String] = Scala.scala3
def testLauncher: Target[PathRef] = cli.launcher()
Expand Down
2 changes: 1 addition & 1 deletion cli/src/scala/cli/signing/ScalaCliSigning.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package scala.cli.signing

import caseapp._
import caseapp.*
import caseapp.core.app.CommandsEntryPoint
import org.bouncycastle.jce.provider.BouncyCastleProvider

Expand Down
3 changes: 1 addition & 2 deletions cli/src/scala/cli/signing/commands/PgpCreate.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import caseapp.core.RemainingArgs
import caseapp.core.app.Command
import org.bouncycastle.bcpg.ArmoredOutputStream

import java.io.{BufferedOutputStream, ByteArrayOutputStream, File}
import java.util.{Base64, HexFormat}
import java.io.{ByteArrayOutputStream, File}

import scala.cli.signing.util.PgpHelper

Expand Down
4 changes: 2 additions & 2 deletions cli/src/scala/cli/signing/commands/PgpCreateOptions.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package scala.cli.signing.commands

import caseapp._
import caseapp.*

import scala.cli.signing.shared.PasswordOption
import scala.cli.signing.util.ArgParsers._
import scala.cli.signing.util.ArgParsers.*

@HelpMessage("Create PGP key pair")
final case class PgpCreateOptions(
Expand Down
5 changes: 1 addition & 4 deletions cli/src/scala/cli/signing/commands/PgpKeyId.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ package scala.cli.signing.commands

import caseapp.core.RemainingArgs
import caseapp.core.app.Command
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator
import org.bouncycastle.openpgp.{PGPPublicKeyRingCollection, PGPUtil}

import java.io.ByteArrayInputStream
import java.nio.charset.StandardCharsets

import scala.jdk.CollectionConverters._
import scala.jdk.CollectionConverters.*

object PgpKeyId extends Command[PgpKeyIdOptions] {

Expand All @@ -18,7 +16,6 @@ object PgpKeyId extends Command[PgpKeyIdOptions] {
)

// from https://stackoverflow.com/questions/9655181/how-to-convert-a-byte-array-to-a-hex-string-in-java/9855338#9855338
private val hexChars = "0123456789abcdef".toCharArray
private def bytesToHex(bytes: Array[Byte]): String = {
val hexChars = Array.ofDim[Char](bytes.length * 2)
for (j <- bytes.indices) {
Expand Down
2 changes: 1 addition & 1 deletion cli/src/scala/cli/signing/commands/PgpKeyIdOptions.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package scala.cli.signing.commands

import caseapp._
import caseapp.*

// format: off
final case class PgpKeyIdOptions(
Expand Down
4 changes: 2 additions & 2 deletions cli/src/scala/cli/signing/commands/PgpSignOptions.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package scala.cli.signing.commands

import caseapp._
import caseapp.*

import scala.cli.signing.shared.PasswordOption
import scala.cli.signing.util.ArgParsers._
import scala.cli.signing.util.ArgParsers.*

// format: off
@HelpMessage("Sign files with PGP")
Expand Down
2 changes: 1 addition & 1 deletion cli/src/scala/cli/signing/commands/PgpVerify.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package scala.cli.signing.commands

import caseapp._
import caseapp.*
import caseapp.core.app.Command
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator
import org.bouncycastle.openpgp.{PGPPublicKeyRingCollection, PGPUtil}
Expand Down
2 changes: 1 addition & 1 deletion cli/src/scala/cli/signing/commands/PgpVerifyOptions.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package scala.cli.signing.commands

import caseapp._
import caseapp.*

@HelpMessage("Verify PGP signatures")
final case class PgpVerifyOptions(
Expand Down
3 changes: 1 addition & 2 deletions cli/src/scala/cli/signing/util/ArgParsers.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package scala.cli.signing.util

import caseapp.core.argparser.ArgParser
import caseapp.core.argparser.SimpleArgParser
import caseapp.core.argparser.{ArgParser, SimpleArgParser}

import scala.cli.signing.shared.PasswordOption

Expand Down
9 changes: 5 additions & 4 deletions cli/src/scala/cli/signing/util/BouncycastleSigner.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import org.bouncycastle.bcpg.{
HashAlgorithmTags,
SymmetricKeyAlgorithmTags
}
import org.bouncycastle.openpgp.{Util => _, _}
import org.bouncycastle.openpgp.*
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory
import org.bouncycastle.openpgp.operator.KeyFingerPrintCalculator
import org.bouncycastle.openpgp.operator.jcajce.{
Expand All @@ -19,11 +19,12 @@ import org.bouncycastle.openpgp.operator.jcajce.{
JcaPGPContentVerifierBuilderProvider,
JcePBESecretKeyDecryptorBuilder
}
import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer

import java.io.{ByteArrayInputStream, ByteArrayOutputStream, InputStream, PrintWriter, StringWriter}

import scala.cli.signing.shared.Secret
import scala.jdk.CollectionConverters._
import scala.cli.signing.util.Util.maybeDecodeBase64
import scala.jdk.CollectionConverters.*
import scala.util.Try

final case class BouncycastleSigner(
Expand Down Expand Up @@ -211,7 +212,7 @@ object BouncycastleSigner {
secretKey: Secret[Array[Byte]],
passwordOpt: Option[Secret[String]]
): BouncycastleSigner = {
val is = new ByteArrayInputStream(Util.maybeDecodeBase64(secretKey.value))
val is = new ByteArrayInputStream(maybeDecodeBase64(secretKey.value))
val secretKey0 = readSecretKey(is)
BouncycastleSigner(secretKey0, passwordOpt)
}
Expand Down
2 changes: 0 additions & 2 deletions cli/src/scala/cli/signing/util/Util.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
package scala.cli.signing.util

import java.nio.charset.StandardCharsets
import java.util.Base64

object Util {
Expand Down
4 changes: 2 additions & 2 deletions shared/src/scala/cli/signing/shared/PasswordOption.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package scala.cli.signing.shared

import com.github.plokhotnyuk.jsoniter_scala.core._
import com.github.plokhotnyuk.jsoniter_scala.macros._
import com.github.plokhotnyuk.jsoniter_scala.core.*
import com.github.plokhotnyuk.jsoniter_scala.macros.*

import java.nio.charset.StandardCharsets

Expand Down