Final tweaks for round 1 use.

This commit is contained in:
Pat Garrity 2024-03-08 22:07:17 -06:00
parent 417ffa6375
commit c3f8de2caa
Signed by: pfm
GPG key ID: 5CA5D21BAB7F3A76
7 changed files with 80 additions and 72 deletions

View file

@ -28,7 +28,7 @@ lazy val IsRelease: Boolean =
lazy val Modifier: String = lazy val Modifier: String =
if (IsRelease) "" else "-SNAPSHOT" if (IsRelease) "" else "-SNAPSHOT"
val DefaultVersion: String = "0.1.2-SNAPSHOT" val DefaultVersion: String = "0.1.3-SNAPSHOT"
lazy val SelectedVersion: String = lazy val SelectedVersion: String =
InputVersion InputVersion

View file

@ -3,11 +3,12 @@ package gs
import java.time.LocalDate import java.time.LocalDate
import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer
/** /** Representation of a rendered Calendar Version.
* Representation of a rendered Calendar Version.
* *
* @param value The version string. * @param value
* @param pattern The pattern which rendered the version string. * The version string.
* @param pattern
* The pattern which rendered the version string.
*/ */
case class CalVer( case class CalVer(
value: String, value: String,
@ -15,11 +16,13 @@ case class CalVer(
) )
object CalVer { object CalVer {
/**
* Render the given pattern to a Calendar Version. /** Render the given pattern to a Calendar Version.
* *
* @param pattern The pattern to render. * @param pattern
* @return The rendered CalVer value. * The pattern to render.
* @return
* The rendered CalVer value.
*/ */
def render(pattern: Pattern): CalVer = { def render(pattern: Pattern): CalVer = {
val today = LocalDate.now() val today = LocalDate.now()
@ -27,10 +30,10 @@ object CalVer {
value = pattern.items.map { value = pattern.items.map {
case Left(component) => case Left(component) =>
component match { component match {
case Component.YYYY => today.getYear().toString() case Component.YYYY => today.getYear().toString()
case Component.MM => today.getMonthValue().toString() case Component.MM => today.getMonthValue().toString()
case Component.DD => today.getDayOfMonth().toString() case Component.DD => today.getDayOfMonth().toString()
case Component.Label(label) => label case Component.Label(label) => label
case Component.GitSha(length) => Git.getSha(length) case Component.GitSha(length) => Git.getSha(length)
} }
case Right(delimiter) => Delimiter.render(delimiter) case Right(delimiter) => Delimiter.render(delimiter)
@ -40,8 +43,8 @@ object CalVer {
} }
object Defaults { object Defaults {
/**
* Default pattern for release versions. /** Default pattern for release versions.
*/ */
val ReleasePattern: Pattern = val ReleasePattern: Pattern =
Pattern Pattern
@ -54,8 +57,7 @@ object CalVer {
.addComponent(Component.GitSha(7)) .addComponent(Component.GitSha(7))
.build() .build()
/** /** Default pattern for pre-release versions.
* Default pattern for pre-release versions.
*/ */
val PreReleasePattern: Pattern = val PreReleasePattern: Pattern =
Pattern Pattern
@ -65,72 +67,75 @@ object CalVer {
.addDelimiter(Delimiter.Dot) .addDelimiter(Delimiter.Dot)
.addComponent(Component.DD) .addComponent(Component.DD)
.addDelimiter(Delimiter.Hyphen) .addDelimiter(Delimiter.Hyphen)
.addComponent(Component.GitSha(7))
.addDelimiter(Delimiter.Hyphen)
.addComponent(Component.Label("SNAPSHOT")) .addComponent(Component.Label("SNAPSHOT"))
.build() .build()
} }
sealed trait Component sealed trait Component
object Component { object Component {
/**
* CalVer Component: Year. /** CalVer Component: Year.
*/ */
case object YYYY extends Component case object YYYY extends Component
/** /** CalVer Component: Month (1-12), without a leading zero.
* CalVer Component: Month (1-12), without a leading zero.
*/ */
case object MM extends Component case object MM extends Component
/** /** CalVer Component: Day of Month, without a leading zero.
* CalVer Component: Day of Month, without a leading zero.
*/ */
case object DD extends Component case object DD extends Component
/** /** CalVer Component: Label.
* CalVer Component: Label.
* *
* This component contains an arbitrary string value. * This component contains an arbitrary string value.
* *
* @param value The value of the label. * @param value
* The value of the label.
*/ */
case class Label(value: String) extends Component case class Label(value: String) extends Component
/** /** CalVer Component. Git SHA.
* CalVer Component. Git SHA.
* *
* This component defines the length (first N characters) of the Git SHA to * This component defines the length (first N characters) of the Git SHA to
* take from the current branch of the current repository. An empty string * take from the current branch of the current repository. An empty string
* is used if lookup fails or no commits exist. * is used if lookup fails or no commits exist.
* *
* @param length The number of characters of the Git SHA to use. * @param length
* The number of characters of the Git SHA to use.
*/ */
case class GitSha(length: Int) extends Component case class GitSha(length: Int) extends Component
def describe(component: Component): String = component match { def describe(component: Component): String = component match {
case YYYY => "YYYY" case YYYY => "YYYY"
case MM => "MM" case MM => "MM"
case DD => "DD" case DD => "DD"
case Label(value) => value case Label(value) => value
case GitSha(length) => s"SHA($length)" case GitSha(length) => s"SHA($length)"
} }
} }
sealed abstract class Delimiter(val value: String) sealed abstract class Delimiter(val value: String)
object Delimiter { object Delimiter {
case object Dot extends Delimiter(".") case object Dot extends Delimiter(".")
case object Hyphen extends Delimiter("-") case object Hyphen extends Delimiter("-")
case object Plus extends Delimiter("+") case object Plus extends Delimiter("+")
case object Underscore extends Delimiter("_") case object Underscore extends Delimiter("_")
def render(delimiter: Delimiter): String = delimiter.value def render(delimiter: Delimiter): String = delimiter.value
} }
final class Pattern private (val items: List[Pattern.Item]) { final class Pattern private (val items: List[Pattern.Item]) {
lazy val str: String = lazy val str: String =
items.map { items.map {
case Left(component) => Component.describe(component) case Left(component) => Component.describe(component)
case Right(delimiter) => Delimiter.render(delimiter) case Right(delimiter) => Delimiter.render(delimiter)
}.mkString }.mkString
@ -159,11 +164,15 @@ object CalVer {
} }
object Builder { object Builder {
def apply(component: Component): Builder = { def apply(component: Component): Builder = {
val b = new Builder() val b = new Builder()
b.addComponent(component) b.addComponent(component)
b b
} }
} }
} }
} }

View file

@ -6,31 +6,30 @@ import sbt._
*/ */
object CalVerKeys { object CalVerKeys {
/** SBT Setting for the calculated CalVer. /** SBT Setting for the calculated CalVer. This can be used as "version".
*/ */
lazy val calVer = settingKey[String]( lazy val calVer = settingKey[String](
"Calculated CalVer." "Calculated CalVer."
) )
/** /** SBT setting which defines the CalVer pattern used to calculate the final
* SBT setting which defines the CalVer pattern used to calculate the final
* version. This should not be set manually, please use * version. This should not be set manually, please use
* `calVerReleasePattern` and `calVerPreReleasePattern`. * `calVerReleasePattern` and `calVerPreReleasePattern`. This pattern is
* selected from those values depending on whether this is a release build or
* not.
*/ */
lazy val calVerPattern = settingKey[CalVer.Pattern]( lazy val calVerPattern = settingKey[CalVer.Pattern](
"Selected CalVer pattern." "Selected CalVer pattern."
) )
/** /** User-defined SBT setting which defines the CalVer pattern to use for a
* User-defined SBT setting which defines the CalVer pattern to use for a
* release build. * release build.
*/ */
lazy val calVerReleasePattern = settingKey[Option[CalVer.Pattern]]( lazy val calVerReleasePattern = settingKey[Option[CalVer.Pattern]](
"Pattern to use for calculating CalVer for release builds." "Pattern to use for calculating CalVer for release builds."
) )
/** /** User-defined SBT setting which defines the CalVer pattern to use for a
* User-defined SBT setting which defines the CalVer pattern to use for a
* pre-release build. * pre-release build.
*/ */
lazy val calVerPreReleasePattern = settingKey[Option[CalVer.Pattern]]( lazy val calVerPreReleasePattern = settingKey[Option[CalVer.Pattern]](

View file

@ -9,23 +9,24 @@ object CalVerPlugin extends AutoPlugin {
import autoImport._ import autoImport._
// Perform all version calculations and expose as a variable. lazy val calVerDefaults: Seq[Setting[_]] =
lazy val calVerDefaults: Seq[Setting[_]] = {
Seq( Seq(
calVerReleasePattern := Some(CalVer.Defaults.ReleasePattern), calVerReleasePattern := Some(CalVer.Defaults.ReleasePattern),
calVerPreReleasePattern := Some(CalVer.Defaults.PreReleasePattern), calVerPreReleasePattern := Some(CalVer.Defaults.PreReleasePattern)
) )
}
override lazy val projectSettings: Seq[Setting[_]] = { override lazy val projectSettings: Seq[Setting[_]] = {
val isRelease = PluginProperties.isRelease() val isRelease = PluginProperties.isRelease()
Seq( Seq(
calVerPattern := { if (isRelease) { calVerPattern := {
calVerReleasePattern.value.getOrElse(CalVer.Defaults.ReleasePattern) if (isRelease)
} else { calVerReleasePattern.value.getOrElse(CalVer.Defaults.ReleasePattern)
calVerPreReleasePattern.value.getOrElse(CalVer.Defaults.PreReleasePattern) else
}}, calVerPreReleasePattern.value.getOrElse(
CalVer.Defaults.PreReleasePattern
)
},
calVer := CalVer.render(calVerPattern.value).value, calVer := CalVer.render(calVerPattern.value).value,
calVerInfo := { calVerInfo := {
val log = Keys.streams.value.log val log = Keys.streams.value.log
@ -37,9 +38,4 @@ object CalVerPlugin extends AutoPlugin {
// Automatically exposed globally. // Automatically exposed globally.
override lazy val globalSettings: Seq[Setting[_]] = calVerDefaults override lazy val globalSettings: Seq[Setting[_]] = calVerDefaults
// Add the custom task.
override lazy val buildSettings: Seq[Setting[_]] = Seq(
)
} }

View file

@ -1,12 +1,14 @@
package gs package gs
object Git { object Git {
/**
* Get the latest SHA. If there are no commits on this branch, the empty /** Get the latest SHA. If there are no commits on this branch, the empty
* string will be returned. * string will be returned.
* *
* @param length The number of characters to take from the SHA. * @param length
* @return The latest SHA. * The number of characters to take from the SHA.
* @return
* The latest SHA.
*/ */
def getSha(length: Int): String = { def getSha(length: Int): String = {
val result = os val result = os
@ -26,4 +28,5 @@ object Git {
else else
"" ""
} }
} }

View file

@ -30,8 +30,8 @@ object PluginProperties {
val ReleaseProperty: String = "release" val ReleaseProperty: String = "release"
/** The value of `-Drelease=<true|false>`, parsed and validated. /** The value of `-Drelease=<true|false>`, parsed and validated.
* *
* If no value is specified, `false` is assumed. * If no value is specified, `false` is assumed.
* *
* @return * @return
* The `release` setting passed as input to SBT. * The `release` setting passed as input to SBT.
@ -41,4 +41,5 @@ object PluginProperties {
ReleaseProperty, ReleaseProperty,
raw => Try(raw.toBoolean).getOrElse(false) raw => Try(raw.toBoolean).getOrElse(false)
).getOrElse(false) ).getOrElse(false)
} }