Skip to content

Commit f7dc7c0

Browse files
committed
Add merging of new and old first-seen version data
1 parent 13b0ff9 commit f7dc7c0

File tree

3 files changed

+32
-18
lines changed

3 files changed

+32
-18
lines changed

modules/core/src/main/scala/org/scalasteward/core/coursier/VersionsCache.scala

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ package org.scalasteward.core.coursier
1919
import cats.implicits.*
2020
import cats.{MonadThrow, Parallel}
2121
import io.circe.generic.semiauto.{deriveCodec, deriveDecoder, deriveEncoder}
22-
import io.circe.{Codec, KeyEncoder}
23-
import org.scalasteward.core.coursier.VersionsCache.{Key, Value}
22+
import io.circe.{Codec, Decoder, Encoder, KeyEncoder}
23+
import org.scalasteward.core.coursier.VersionsCache.{Key, Value, VersionWithFirstSeen}
2424
import org.scalasteward.core.data.{Dependency, Resolver, Scope, Version}
2525
import org.scalasteward.core.persistence.KeyValueStore
2626
import org.scalasteward.core.util.{DateTimeAlg, Timestamp}
27+
2728
import scala.concurrent.duration.FiniteDuration
28-
import io.circe.Encoder
29-
import io.circe.Decoder
3029

3130
final class VersionsCache[F[_]](
3231
cacheTtl: FiniteDuration,
@@ -40,30 +39,39 @@ final class VersionsCache[F[_]](
4039
def getVersions(dependency: Scope.Dependency, maxAge: Option[FiniteDuration]): F[List[Version]] =
4140
dependency.resolvers
4241
.parFlatTraverse(getVersionsImpl(dependency.value, _, maxAge.getOrElse(cacheTtl)))
43-
.map(_.distinct.sorted)
42+
.map(_.map(_.version).distinct.sorted) // TODO - remove `.map(_.version)`
4443

4544
private def getVersionsImpl(
4645
dependency: Dependency,
4746
resolver: Resolver,
4847
maxAge: FiniteDuration
49-
): F[List[Version]] =
48+
): F[List[VersionWithFirstSeen]] =
5049
dateTimeAlg.currentTimestamp.flatMap { now =>
5150
val key = Key(dependency, resolver)
5251
store.get(key).flatMap {
5352
case Some(value) if value.updatedAt.until(now) <= (maxAge * value.maxAgeFactor) =>
54-
F.pure(value.versions.map(_.version))
53+
F.pure(value.versions)
5554
case maybeValue =>
5655
coursierAlg.getVersions(dependency, resolver).attempt.flatMap {
5756
case Right(versions) =>
58-
store.put(key, Value(now, versions.map(addCurrentTime), None)).as(versions)
57+
val existingFirstSeenByVersion: Map[Version, Timestamp] =
58+
maybeValue
59+
.map(_.versions.flatMap(vwfs => vwfs.firstSeen.map(vwfs.version -> _)).toMap)
60+
.getOrElse(Map.empty)
61+
val updatedVersionsWithFirstSeen =
62+
versions.map(v =>
63+
VersionWithFirstSeen(v, Some(existingFirstSeenByVersion.getOrElse(v, now)))
64+
)
65+
66+
store
67+
.put(key, Value(now, updatedVersionsWithFirstSeen, None))
68+
.as(updatedVersionsWithFirstSeen)
5969
case Left(throwable) =>
6070
val versions = maybeValue.map(_.versions).getOrElse(List.empty)
6171
store.put(key, Value(now, versions, Some(throwable.toString))).as(versions)
6272
}
6373
}
6474
}
65-
66-
private def addCurrentTime(version: Version): VersionWithFirstSeen = {}
6775
}
6876

6977
object VersionsCache {
@@ -102,10 +110,10 @@ object VersionsCache {
102110

103111
object VersionWithFirstSeen {
104112
implicit val valueEncoder: Encoder[VersionWithFirstSeen] = deriveEncoder
105-
implicit val valueDecoder: Decoder[VersionWithFirstSeen] =
106-
deriveDecoder[VersionWithFirstSeen]
107-
.or(
108-
Decoder[Version].map(v => VersionWithFirstSeen(v, None))
109-
)
113+
implicit val valueDecoder: Decoder[VersionWithFirstSeen] = {
114+
val legacyVersionStringDecoder = Decoder[Version].map(VersionWithFirstSeen(_, None))
115+
116+
deriveDecoder[VersionWithFirstSeen].or(legacyVersionStringDecoder)
117+
}
110118
}
111119
}

modules/core/src/main/scala/org/scalasteward/core/data/Version.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import cats.implicits.*
2121
import cats.parse.{Numbers, Parser, Rfc5234}
2222
import io.circe.{Decoder, Encoder}
2323
import org.scalasteward.core.data.Version.startsWithDate
24-
import java.time.Instant
2524

2625
final case class Version(value: String) {
2726
override def toString: String = value

modules/core/src/test/scala/org/scalasteward/core/coursier/VersionsCacheTest.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.scalasteward.core.coursier
22

33
import io.circe.parser
44
import munit.FunSuite
5-
import org.scalasteward.core.coursier.VersionsCache.Value
5+
import org.scalasteward.core.coursier.VersionsCache.{Value, VersionWithFirstSeen}
66
import org.scalasteward.core.data.Version
77
import org.scalasteward.core.util.Timestamp
88

@@ -11,7 +11,14 @@ import scala.io.Source
1111
class VersionsCacheTest extends FunSuite {
1212
test("version cache deserialisation without first seen") {
1313
val input = Source.fromResource("versions-cache-value-without-first-seen.json").mkString
14-
val expected = Value(Timestamp(1000), List(Version("1.0.0"), Version("1.0.1")), None)
14+
val expected = Value(
15+
Timestamp(1000),
16+
List(
17+
VersionWithFirstSeen(Version("1.0.0"), None),
18+
VersionWithFirstSeen(Version("1.0.1"), None)
19+
),
20+
None
21+
)
1522
assertEquals(parser.decode[Value](input), Right(expected))
1623
}
1724
}

0 commit comments

Comments
 (0)