Skip to content

Commit 68f0eba

Browse files
committed
Improve visibility modifiers in SafeDigestible, and add contraMap
1 parent 028c961 commit 68f0eba

File tree

4 files changed

+111
-25
lines changed

4 files changed

+111
-25
lines changed

.github/workflows/ci.yml

Lines changed: 64 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,35 @@ jobs:
2929
matrix:
3030
os: [ubuntu-latest]
3131
scala: [2.13.8, 3.1.1]
32-
java: [temurin@8, temurin@11]
32+
java: [temurin@17, temurin@11, temurin@8]
3333
project: [rootJVM]
3434
exclude:
3535
- scala: 3.1.1
3636
java: temurin@11
37+
- scala: 3.1.1
38+
java: temurin@8
3739
runs-on: ${{ matrix.os }}
3840
steps:
3941
- name: Checkout current branch (full)
4042
uses: actions/checkout@v2
4143
with:
4244
fetch-depth: 0
4345

44-
- name: Download Java (temurin@8)
45-
id: download-java-temurin-8
46-
if: matrix.java == 'temurin@8'
46+
- name: Download Java (temurin@17)
47+
id: download-java-temurin-17
48+
if: matrix.java == 'temurin@17'
4749
uses: typelevel/download-java@v1
4850
with:
4951
distribution: temurin
50-
java-version: 8
52+
java-version: 17
5153

52-
- name: Setup Java (temurin@8)
53-
if: matrix.java == 'temurin@8'
54+
- name: Setup Java (temurin@17)
55+
if: matrix.java == 'temurin@17'
5456
uses: actions/setup-java@v2
5557
with:
5658
distribution: jdkfile
57-
java-version: 8
58-
jdkFile: ${{ steps.download-java-temurin-8.outputs.jdkFile }}
59+
java-version: 17
60+
jdkFile: ${{ steps.download-java-temurin-17.outputs.jdkFile }}
5961

6062
- name: Download Java (temurin@11)
6163
id: download-java-temurin-11
@@ -73,6 +75,22 @@ jobs:
7375
java-version: 11
7476
jdkFile: ${{ steps.download-java-temurin-11.outputs.jdkFile }}
7577

78+
- name: Download Java (temurin@8)
79+
id: download-java-temurin-8
80+
if: matrix.java == 'temurin@8'
81+
uses: typelevel/download-java@v1
82+
with:
83+
distribution: temurin
84+
java-version: 8
85+
86+
- name: Setup Java (temurin@8)
87+
if: matrix.java == 'temurin@8'
88+
uses: actions/setup-java@v2
89+
with:
90+
distribution: jdkfile
91+
java-version: 8
92+
jdkFile: ${{ steps.download-java-temurin-8.outputs.jdkFile }}
93+
7694
- name: Cache sbt
7795
uses: actions/cache@v2
7896
with:
@@ -89,14 +107,14 @@ jobs:
89107
run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' 'project /' githubWorkflowCheck
90108

91109
- name: Check formatting
92-
if: matrix.java == 'temurin@8'
110+
if: matrix.java == 'temurin@17'
93111
run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' scalafmtCheckAll 'project /' scalafmtSbtCheck
94112

95113
- name: Test
96114
run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' test
97115

98116
- name: Generate API documentation
99-
if: matrix.java == 'temurin@8'
117+
if: matrix.java == 'temurin@17'
100118
run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' doc
101119

102120
- name: Make target directories
@@ -122,29 +140,29 @@ jobs:
122140
matrix:
123141
os: [ubuntu-latest]
124142
scala: [2.13.8]
125-
java: [temurin@8]
143+
java: [temurin@17]
126144
runs-on: ${{ matrix.os }}
127145
steps:
128146
- name: Checkout current branch (full)
129147
uses: actions/checkout@v2
130148
with:
131149
fetch-depth: 0
132150

133-
- name: Download Java (temurin@8)
134-
id: download-java-temurin-8
135-
if: matrix.java == 'temurin@8'
151+
- name: Download Java (temurin@17)
152+
id: download-java-temurin-17
153+
if: matrix.java == 'temurin@17'
136154
uses: typelevel/download-java@v1
137155
with:
138156
distribution: temurin
139-
java-version: 8
157+
java-version: 17
140158

141-
- name: Setup Java (temurin@8)
142-
if: matrix.java == 'temurin@8'
159+
- name: Setup Java (temurin@17)
160+
if: matrix.java == 'temurin@17'
143161
uses: actions/setup-java@v2
144162
with:
145163
distribution: jdkfile
146-
java-version: 8
147-
jdkFile: ${{ steps.download-java-temurin-8.outputs.jdkFile }}
164+
java-version: 17
165+
jdkFile: ${{ steps.download-java-temurin-17.outputs.jdkFile }}
148166

149167
- name: Download Java (temurin@11)
150168
id: download-java-temurin-11
@@ -162,6 +180,22 @@ jobs:
162180
java-version: 11
163181
jdkFile: ${{ steps.download-java-temurin-11.outputs.jdkFile }}
164182

183+
- name: Download Java (temurin@8)
184+
id: download-java-temurin-8
185+
if: matrix.java == 'temurin@8'
186+
uses: typelevel/download-java@v1
187+
with:
188+
distribution: temurin
189+
java-version: 8
190+
191+
- name: Setup Java (temurin@8)
192+
if: matrix.java == 'temurin@8'
193+
uses: actions/setup-java@v2
194+
with:
195+
distribution: jdkfile
196+
java-version: 8
197+
jdkFile: ${{ steps.download-java-temurin-8.outputs.jdkFile }}
198+
165199
- name: Cache sbt
166200
uses: actions/cache@v2
167201
with:
@@ -194,6 +228,16 @@ jobs:
194228
tar xf targets.tar
195229
rm targets.tar
196230
231+
- name: Download target directories (2.13.8, rootJVM)
232+
uses: actions/download-artifact@v2
233+
with:
234+
name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.8-rootJVM
235+
236+
- name: Inflate target directories (2.13.8, rootJVM)
237+
run: |
238+
tar xf targets.tar
239+
rm targets.tar
240+
197241
- name: Download target directories (3.1.1, rootJVM)
198242
uses: actions/download-artifact@v2
199243
with:

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ ThisBuild / scalaVersion := Scala213
1717
ThisBuild / crossScalaVersions := Seq(Scala213, "3.1.1")
1818

1919
ThisBuild / githubWorkflowJavaVersions := List(
20-
JavaSpec.temurin("8"),
20+
JavaSpec.temurin("17"),
2121
JavaSpec.temurin("11"),
22+
JavaSpec.temurin("8"),
2223
)
2324

2425
ThisBuild / tlCiHeaderCheck := false

core/src/main/scala/au/id/tmm/digest4s/digest/Digestable.scala

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,17 @@ import org.apache.commons.codec.digest.DigestUtils
99
import scala.collection.immutable.ArraySeq
1010

1111
trait SafeDigestible[-A] {
12-
protected[digest] def digest(digestUtils: DigestUtils, a: A): Array[Byte]
12+
def digest(digestUtils: DigestUtils, a: A): Array[Byte]
13+
14+
def contraMap[B](f: B => A): SafeDigestible[B] = new SafeDigestible[B] {
15+
override def digest(digestUtils: DigestUtils, b: B): Array[Byte] =
16+
SafeDigestible.this.digest(digestUtils, f(b))
17+
}
18+
19+
def asUnsafeDigestible: UnsafeDigestible[A] = new UnsafeDigestible[A] {
20+
override def unsafeDigest(digestUtils: DigestUtils, a: A): Array[Byte] =
21+
SafeDigestible.this.digest(digestUtils, a)
22+
}
1323
}
1424

1525
object SafeDigestible {
@@ -44,13 +54,18 @@ object SafeDigestible {
4454
}
4555

4656
trait UnsafeDigestible[-A] {
47-
protected def unsafeDigest(digestUtils: DigestUtils, a: A): Array[Byte]
57+
def unsafeDigest(digestUtils: DigestUtils, a: A): Array[Byte]
4858

4959
private[digest] def digest(digestUtils: DigestUtils, a: A): Either[IOException, Array[Byte]] =
5060
try Right(unsafeDigest(digestUtils, a))
5161
catch {
5262
case e: IOException => Left(e)
5363
}
64+
65+
def contraMap[B](f: B => A): UnsafeDigestible[B] = new UnsafeDigestible[B] {
66+
override def unsafeDigest(digestUtils: DigestUtils, b: B): Array[Byte] =
67+
UnsafeDigestible.this.unsafeDigest(digestUtils, f(b))
68+
}
5469
}
5570

5671
object UnsafeDigestible {

core/src/test/scala/au/id/tmm/digest4s/digest/DigestSyntaxSpec.scala

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class DigestSyntaxSpec extends FunSuite {
3737
)(implicit
3838
loc: Location,
3939
): Unit = {
40-
implicit val safeDigestableInstance: SafeDigestible[A] = digestibleTestDimension.safeDigestible
40+
implicit val safeDigestibleInstance: SafeDigestible[A] = digestibleTestDimension.safeDigestible
4141
implicit val bytesLikeInstance: BytesLike[D] = digestTestDimension.bytesLike
4242

4343
digestTestDimension.tests.foreach { case (bytes, expectedDigest) =>
@@ -49,6 +49,23 @@ class DigestSyntaxSpec extends FunSuite {
4949
val obtained = digestTestDimension.safe(a)
5050
assertEquals(obtained, expectedDigest, obtained.asHexString)
5151
}
52+
53+
test(
54+
s"${digestTestDimension.classTag.runtimeClass.getSimpleName} (as UnsafeDigestible) for ${digestibleTestDimension.name} (${bytes.asHexString} -> ${expectedDigest.asHexString})",
55+
) {
56+
implicit val unsafeDigestibleInstance: UnsafeDigestible[A] = safeDigestibleInstance.asUnsafeDigestible
57+
val obtained = digestTestDimension.unsafe(a)
58+
assertEquals(obtained, Right(expectedDigest), obtained.map(_.asHexString))
59+
}
60+
61+
test(
62+
s"${digestTestDimension.classTag.runtimeClass.getSimpleName} (contraMapped) for ${digestibleTestDimension.name} (${bytes.asHexString} -> ${expectedDigest.asHexString})",
63+
) {
64+
implicit val contraMappedInstance: SafeDigestible[Array[Byte]] =
65+
safeDigestibleInstance.contraMap(digestibleTestDimension.fromBytes)
66+
val obtained = digestTestDimension.safe(bytes)
67+
assertEquals(obtained, expectedDigest, obtained.asHexString)
68+
}
5269
}
5370
}
5471

@@ -59,7 +76,7 @@ class DigestSyntaxSpec extends FunSuite {
5976
loc: Location,
6077
): Unit =
6178
digestTestDimension.tests.foreach { case (bytes, expectedDigest) =>
62-
implicit val safeDigestableInstance: UnsafeDigestible[A] = digestibleTestDimension.unsafeDigestible
79+
implicit val safeDigestibleInstance: UnsafeDigestible[A] = digestibleTestDimension.unsafeDigestible
6380
implicit val bytesLikeInstance: BytesLike[D] = digestTestDimension.bytesLike
6481

6582
val a: A = digestibleTestDimension.fromBytes(bytes)
@@ -70,6 +87,15 @@ class DigestSyntaxSpec extends FunSuite {
7087
val obtained = digestTestDimension.unsafe(a)
7188
assertEquals(obtained, Right(expectedDigest), obtained.map(_.asHexString))
7289
}
90+
91+
test(
92+
s"${digestTestDimension.classTag.runtimeClass.getSimpleName} (contraMapped) for ${digestibleTestDimension.classTag.runtimeClass.getSimpleName} (${bytes.asHexString} -> ${expectedDigest.asHexString})",
93+
) {
94+
implicit val contraMappedInstance: UnsafeDigestible[Array[Byte]] =
95+
safeDigestibleInstance.contraMap(digestibleTestDimension.fromBytes)
96+
val obtained = digestTestDimension.unsafe(bytes)
97+
assertEquals(obtained, Right(expectedDigest), obtained.map(_.asHexString))
98+
}
7399
}
74100

75101
}

0 commit comments

Comments
 (0)