-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 5aec800
Showing
11 changed files
with
607 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
# This file was automatically generated by sbt-github-actions using the | ||
# githubWorkflowGenerate task. You should add and commit this file to | ||
# your git repository. It goes without saying that you shouldn't edit | ||
# this file by hand! Instead, if you wish to make changes, you should | ||
# change your sbt build configuration to revise the workflow description | ||
# to meet your needs, then regenerate this file. | ||
|
||
name: Continuous Integration | ||
|
||
on: | ||
pull_request: | ||
branches: ['**'] | ||
push: | ||
branches: ['**'] | ||
tags: [v*] | ||
|
||
env: | ||
JAVA_OPTS: '-Xmx4g' | ||
|
||
jobs: | ||
build: | ||
name: Build and Test | ||
strategy: | ||
matrix: | ||
os: [ubuntu-latest] | ||
scala: [3.4.2] | ||
java: [temurin@17] | ||
runs-on: ${{ matrix.os }} | ||
steps: | ||
- name: Checkout current branch (full) | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- name: Setup Java (temurin@17) | ||
if: matrix.java == 'temurin@17' | ||
uses: actions/setup-java@v4 | ||
with: | ||
distribution: temurin | ||
java-version: 17 | ||
cache: sbt | ||
|
||
- name: Check that workflows are up to date | ||
run: sbt '++ ${{ matrix.scala }}' githubWorkflowCheck | ||
|
||
- name: Build project | ||
run: sbt '++ ${{ matrix.scala }}' test | ||
|
||
- name: Compress target directories | ||
run: tar cf targets.tar target project/target | ||
|
||
- name: Upload target directories | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} | ||
path: targets.tar | ||
|
||
publish: | ||
name: Publish Artifacts | ||
needs: [build] | ||
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') | ||
strategy: | ||
matrix: | ||
os: [ubuntu-latest] | ||
scala: [3.4.2] | ||
java: [temurin@17] | ||
runs-on: ${{ matrix.os }} | ||
steps: | ||
- name: Checkout current branch (full) | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- name: Setup Java (temurin@17) | ||
if: matrix.java == 'temurin@17' | ||
uses: actions/setup-java@v4 | ||
with: | ||
distribution: temurin | ||
java-version: 17 | ||
cache: sbt | ||
|
||
- name: Download target directories (3.4.2) | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: target-${{ matrix.os }}-3.4.2-${{ matrix.java }} | ||
|
||
- name: Inflate target directories (3.4.2) | ||
run: | | ||
tar xf targets.tar | ||
rm targets.tar | ||
- name: Publish project | ||
env: | ||
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} | ||
PGP_SECRET: ${{ secrets.PGP_SECRET }} | ||
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} | ||
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} | ||
run: sbt ci-release |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# This file was automatically generated by sbt-github-actions using the | ||
# githubWorkflowGenerate task. You should add and commit this file to | ||
# your git repository. It goes without saying that you shouldn't edit | ||
# this file by hand! Instead, if you wish to make changes, you should | ||
# change your sbt build configuration to revise the workflow description | ||
# to meet your needs, then regenerate this file. | ||
|
||
name: Clean | ||
|
||
on: push | ||
|
||
jobs: | ||
delete-artifacts: | ||
name: Delete Artifacts | ||
runs-on: ubuntu-latest | ||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- name: Delete artifacts | ||
shell: bash {0} | ||
run: | | ||
# Customize those three lines with your repository and credentials: | ||
REPO=${GITHUB_API_URL}/repos/${{ github.repository }} | ||
# A shortcut to call GitHub API. | ||
ghapi() { curl --silent --location --user _:$GITHUB_TOKEN "$@"; } | ||
# A temporary file which receives HTTP response headers. | ||
TMPFILE=$(mktemp) | ||
# An associative array, key: artifact name, value: number of artifacts of that name. | ||
declare -A ARTCOUNT | ||
# Process all artifacts on this repository, loop on returned "pages". | ||
URL=$REPO/actions/artifacts | ||
while [[ -n "$URL" ]]; do | ||
# Get current page, get response headers in a temporary file. | ||
JSON=$(ghapi --dump-header $TMPFILE "$URL") | ||
# Get URL of next page. Will be empty if we are at the last page. | ||
URL=$(grep '^Link:' "$TMPFILE" | tr ',' '\n' | grep 'rel="next"' | head -1 | sed -e 's/.*<//' -e 's/>.*//') | ||
rm -f $TMPFILE | ||
# Number of artifacts on this page: | ||
COUNT=$(( $(jq <<<$JSON -r '.artifacts | length') )) | ||
# Loop on all artifacts on this page. | ||
for ((i=0; $i < $COUNT; i++)); do | ||
# Get name of artifact and count instances of this name. | ||
name=$(jq <<<$JSON -r ".artifacts[$i].name?") | ||
ARTCOUNT[$name]=$(( $(( ${ARTCOUNT[$name]} )) + 1)) | ||
id=$(jq <<<$JSON -r ".artifacts[$i].id?") | ||
size=$(( $(jq <<<$JSON -r ".artifacts[$i].size_in_bytes?") )) | ||
printf "Deleting '%s' #%d, %'d bytes\n" $name ${ARTCOUNT[$name]} $size | ||
ghapi -X DELETE $REPO/actions/artifacts/$id | ||
done | ||
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# macOS | ||
.DS_Store | ||
|
||
# sbt specific | ||
dist/* | ||
target/ | ||
lib_managed/ | ||
src_managed/ | ||
project/boot/ | ||
project/plugins/project/ | ||
project/local-plugins.sbt | ||
.history | ||
.ensime | ||
.ensime_cache/ | ||
.sbt-scripted/ | ||
local.sbt | ||
|
||
# Bloop | ||
.bsp | ||
|
||
# VS Code | ||
.vscode/ | ||
|
||
# Metals | ||
.bloop/ | ||
.metals/ | ||
metals.sbt | ||
|
||
# IDEA | ||
.idea | ||
.idea_modules | ||
/.worksheet/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
version = "3.8.1" | ||
runner.dialect = scala3 | ||
|
||
maxColumn = 120 | ||
align.preset = most | ||
align.multiline = false | ||
rewrite.rules = [RedundantBraces, RedundantParens] | ||
rewrite.scala3.convertToNewSyntax = true | ||
rewrite.scala3.removeOptionalBraces = true | ||
docstrings.wrapMaxColumn = 80 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
# `stubby` | ||
|
||
[![Release Artifacts][Badge-SonatypeReleases]][Link-SonatypeReleases] | ||
[![Snapshot Artifacts][Badge-SonatypeSnapshots]][Link-SonatypeSnapshots] | ||
|
||
[Badge-SonatypeReleases]: https://img.shields.io/nexus/r/https/oss.sonatype.org/io.github.kitlangton/stubby_3.svg "Sonatype Releases" | ||
[Badge-SonatypeSnapshots]: https://img.shields.io/nexus/s/https/oss.sonatype.org/io.github.kitlangton/stubby_3.svg "Sonatype Snapshots" | ||
[Link-SonatypeSnapshots]: https://oss.sonatype.org/content/repositories/snapshots/io/github/kitlangton/stubby_3/ "Sonatype Snapshots" | ||
[Link-SonatypeReleases]: https://oss.sonatype.org/content/repositories/releases/io/github/kitlangton/stubby_3/ "Sonatype Releases" | ||
|
||
A simple stubbing library for ZIO tests. | ||
|
||
```scala | ||
libraryDependencies += "io.github.kitlangton" %% "stubby" % "0.1.0" | ||
``` | ||
|
||
### Example Usage | ||
|
||
Given the following contrived API. | ||
|
||
```scala | ||
trait MagicAPI: | ||
def destroyPlanet(planet: String): IO[MagicError, Unit] | ||
def pureMethod(int: Int): String | ||
|
||
enum MagicError extends Exception: | ||
case MagicBackfired | ||
case TooManyMagic | ||
``` | ||
|
||
And the following application logic. | ||
|
||
```scala | ||
class App(magicApi: MagicAPI): | ||
def destroy: Task[String] = | ||
magicApi | ||
.destroyPlanet("Earth") | ||
.as("Planet destroyed") | ||
.catchAll { | ||
case MagicError.MagicBackfired => ZIO.succeed("Magic backfired") | ||
case MagicError.TooManyMagic => ZIO.succeed("Too many magic") | ||
} | ||
|
||
def usePure: String = | ||
s"Pure Magic: ${magicApi.pureMethod(42)}" | ||
|
||
object App: | ||
val layer: ZLayer[MagicAPI, Nothing, App] = | ||
ZLayer.fromFunction(App.apply) | ||
|
||
def destroy = ZIO.serviceWithZIO[App](_.destroy) | ||
def usePure = ZIO.serviceWith[App](_.usePure) | ||
``` | ||
|
||
Use `stubby` to stub methods and test your application: | ||
|
||
```scala | ||
object AppSpec extends ZIOSpecDefault: | ||
val spec = | ||
suiteAll("App") { | ||
|
||
test("fails when magic backfires") { | ||
for | ||
// Override the destroyPlanet method to always fail with MagicBackfired | ||
_ <- stub[MagicAPI](_.destroyPlanet(any)) { | ||
ZIO.fail(MagicError.MagicBackfired) | ||
} | ||
result <- App.destroy | ||
yield assertTrue(result == "Magic backfired") | ||
} | ||
|
||
test("returns the result of the pure method") { | ||
for | ||
// Or stub a pure method to return a specific value | ||
_ <- stub[MagicAPI](_.pureMethod(any)) { | ||
"HELP ME I'M TRAPPED IN AN EXAMPLE" | ||
} | ||
result <- App.usePure | ||
yield assertTrue(result == "Pure Magic: HELP ME I'M TRAPPED IN AN EXAMPLE") | ||
} | ||
|
||
}.provide( | ||
App.layer, | ||
stubbed[MagicAPI] // <- stubbed[MagicAPI] will create a Layer[MagicAPI] | ||
) | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
val scala3Version = "3.4.2" | ||
|
||
inThisBuild( | ||
List( | ||
name := "stubby", | ||
normalizedName := "stubby", | ||
organization := "io.github.kitlangton", | ||
homepage := Some(url("https://github.com/kitlangton/stubby")), | ||
scalaVersion := scala3Version, | ||
licenses := List("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0")), | ||
developers := List( | ||
Developer("kitlangton", "Kit Langton", "kit.langton@gmail.com", url("https://github.com/kitlangton")) | ||
), | ||
semanticdbEnabled := true, | ||
semanticdbVersion := scalafixSemanticdb.revision | ||
) | ||
) | ||
|
||
Global / onChangedBuildSource := ReloadOnSourceChanges | ||
|
||
//////////////////////// | ||
// sbt-github-actions // | ||
//////////////////////// | ||
ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("17")) | ||
|
||
ThisBuild / githubWorkflowEnv := Map("JAVA_OPTS" -> "-Xmx4g") | ||
ThisBuild / githubWorkflowTargetTags ++= Seq("v*") | ||
ThisBuild / githubWorkflowPublishTargetBranches := | ||
Seq( | ||
RefPredicate.StartsWith(Ref.Tag("v")), | ||
RefPredicate.Equals(Ref.Branch("main")) | ||
) | ||
|
||
ThisBuild / githubWorkflowPublish := Seq( | ||
WorkflowStep.Sbt( | ||
commands = List("ci-release"), | ||
name = Some("Publish project"), | ||
env = Map( | ||
"PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}", | ||
"PGP_SECRET" -> "${{ secrets.PGP_SECRET }}", | ||
"SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}", | ||
"SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}" | ||
) | ||
) | ||
) | ||
|
||
///////////////////////// | ||
// Project Definitions // | ||
///////////////////////// | ||
|
||
val zioVersion = "2.1.2" | ||
|
||
lazy val root = project | ||
.in(file(".")) | ||
.settings( | ||
name := "stubby", | ||
scalaVersion := scala3Version, | ||
libraryDependencies ++= Seq( | ||
"dev.zio" %% "zio" % zioVersion, | ||
"dev.zio" %% "zio-test" % zioVersion % Test, | ||
"dev.zio" %% "zio-test-sbt" % zioVersion % Test, | ||
"org.scala-lang" %% "scala3-compiler" % scala3Version % "provided" | ||
) | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
sbt.version=1.10.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
addSbtPlugin("com.github.sbt" % "sbt-github-actions" % "0.23.0") | ||
addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12") | ||
|
||
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") | ||
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.12.1") | ||
|
||
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0") | ||
addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.3.2") | ||
addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.3.2") | ||
addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.3") |
Oops, something went wrong.