Skip to content
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

fix: SYNC_REPO_METADATA to use GL project's name not payload's #1662

Merged
merged 1 commit into from
Aug 15, 2023
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
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,16 @@ private object NewValuesCalculator extends NewValuesCalculator {
glData: DataExtract.GL,
maybePayloadData: Option[DataExtract.Payload]
): NewValues = NewValues(
maybeNewName(tsData, glData, maybePayloadData),
maybeNewName(tsData, glData),
Option.when(tsData.visibility != glData.visibility)(glData.visibility),
maybeNewDateModified(tsData, glData),
maybeNewDesc(tsData, glData, maybePayloadData),
maybeNewKeywords(tsData, glData, maybePayloadData),
maybeNewImages(tsData, glData, maybePayloadData)
)

private def maybeNewName(tsData: DataExtract.TS,
glData: DataExtract.GL,
maybePayloadData: Option[DataExtract.Payload]
) = {
val potentiallyNewName = maybePayloadData.getOrElse(glData).name
Option.when(tsData.name != potentiallyNewName)(potentiallyNewName)
}
private def maybeNewName(tsData: DataExtract.TS, glData: DataExtract.GL) =
Option.when(tsData.name != glData.name)(glData.name)

private def maybeNewDateModified(tsData: DataExtract.TS, glData: DataExtract.GL) =
tsData.maybeDateModified -> glData.maybeDateModified match {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import io.renku.cli.model.Ontologies.{Schema => CliSchema}
import io.renku.eventlog.api.EventLogClient.EventPayload
import io.renku.graph.model.images.Image
import io.renku.graph.model.projects
import io.renku.jsonld.{Cursor, Property}
import org.typelevel.log4cats.Logger

private trait PayloadDataExtractor[F[_]] {
Expand Down Expand Up @@ -56,30 +55,20 @@ private class PayloadDataExtractorImpl[F[_]: MonadThrow: Logger] extends Payload
Option.empty[DataExtract.Payload].pure[F]
case Some(jsonLD) =>
jsonLD.cursor
.as(decodeList(dataExtract(slug)))
.as[List[DataExtract.Payload]]
.map(_.headOption)
.fold(logWarn(slug), _.pure[F])
}

private def dataExtract(slug: projects.Slug): JsonLDDecoder[DataExtract.Payload] =
private implicit lazy val dataExtract: JsonLDDecoder[DataExtract.Payload] =
JsonLDDecoder.entity(CliProject.entityTypes) { cur =>
for {
name <- cur.downField(CliSchema.name).as[Option[projects.Name]] >>= {
case None => decodingFailure(CliSchema.name, cur).asLeft
case Some(v) => v.asRight
}
maybeDesc <- cur.downField(CliSchema.description).as[Option[projects.Description]]
keywords <- cur.downField(CliSchema.keywords).as[Set[Option[projects.Keyword]]].map(_.flatten)
images <- cur.downField(CliSchema.image).as[List[Image]].map(_.sortBy(_.position).map(_.uri))
} yield DataExtract.Payload(slug, name, maybeDesc, keywords, images)
} yield DataExtract.Payload(maybeDesc, keywords, images)
}

private def decodingFailure(propName: Property, cur: Cursor) =
DecodingFailure(
DecodingFailure.Reason.CustomReason(show"no '$propName' property in the payload"),
cur.jsonLD.toJson.hcursor
)

private def logError(slug: projects.Slug): Throwable => F[Option[JsonLD]] =
Logger[F]
.error(_)(show"$categoryName: cannot process data from the payload for $slug")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ import io.renku.triplesstore.SparqlQuery
import java.time.Instant

private sealed trait DataExtract {
val slug: projects.Slug
val name: projects.Name
val maybeDateModified: Option[projects.DateModified]
val maybeDesc: Option[projects.Description]
val keywords: Set[projects.Keyword]
Expand Down Expand Up @@ -55,9 +53,7 @@ private object DataExtract {
override val maybeDateModified: Option[projects.DateModified] =
List(updatedAt, lastActivityAt).max.map(projects.DateModified.apply)
}
final case class Payload(slug: projects.Slug,
name: projects.Name,
maybeDesc: Option[projects.Description],
final case class Payload(maybeDesc: Option[projects.Description],
keywords: Set[projects.Keyword],
images: List[ImageUri]
) extends DataExtract {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class EventProcessorSpec extends AsyncFlatSpec with AsyncIOSpec with should.Matc
eventPayloads[IO].map(_.generateOne) >>= { payload =>
givenPayloadFinding(event.slug, returning = payload.some.pure[IO])

val maybePayloadData = payloadDataExtracts(having = event.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption
givenPayloadDataExtraction(event.slug, payload, returning = maybePayloadData.pure[IO])

val updates = updateCommands.generateList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import cats.syntax.all._
import io.renku.eventlog.api.events.Generators.redoProjectTransformationEvents
import io.renku.generators.CommonGraphGenerators.sparqlQueries
import io.renku.generators.Generators.Implicits._
import io.renku.graph.model.RenkuTinyTypeGenerators.{imageUris, projectDescriptions, projectKeywords, projectModifiedDates, projectNames, projectSlugs, projectResourceIds, projectVisibilities}
import io.renku.graph.model.RenkuTinyTypeGenerators.{imageUris, projectDescriptions, projectKeywords, projectModifiedDates, projectNames, projectResourceIds, projectSlugs, projectVisibilities}
import io.renku.graph.model.{entities, projects}
import org.scalacheck.Gen

Expand All @@ -48,12 +48,11 @@ private object Generators {
maybeImage <- imageUris.toGeneratorOfOptions
} yield DataExtract.GL(having, name, visibility, updatedAt, lastActivityAt, maybeDesc, keywords, maybeImage)

def payloadDataExtracts(having: projects.Slug = projectSlugs.generateOne): Gen[DataExtract.Payload] = for {
name <- projectNames
lazy val payloadDataExtracts: Gen[DataExtract.Payload] = for {
maybeDesc <- projectDescriptions.toGeneratorOfOptions
keywords <- projectKeywords.toGeneratorOfSet(min = 0)
imageUris <- imageUris.toGeneratorOfList()
} yield DataExtract.Payload(having, name, maybeDesc, keywords, imageUris)
} yield DataExtract.Payload(maybeDesc, keywords, imageUris)

def tsDataFrom(project: entities.Project): DataExtract.TS =
DataExtract.TS(
Expand Down Expand Up @@ -84,7 +83,7 @@ private object Generators {
}

def payloadDataFrom(data: DataExtract.TS): DataExtract.Payload =
DataExtract.Payload(data.slug, data.name, data.maybeDesc, data.keywords, data.images)
DataExtract.Payload(data.maybeDesc, data.keywords, data.images)

val sparqlUpdateCommands: Gen[UpdateCommand.Sparql] = sparqlQueries.map(UpdateCommand.Sparql)
val eventUpdateCommands: Gen[UpdateCommand.Event] = redoProjectTransformationEvents.map(UpdateCommand.Event)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,41 +34,22 @@ class NewValuesCalculatorSpec extends AnyWordSpec with should.Matchers with Opti

"new name" should {

"be None if ts and gl names are the same - no payload case" in {
"be None if ts and gl names are the same" in {

val tsData = tsDataExtracts().generateOne
val glData = glDataFrom(tsData)

NewValuesCalculator.findNewValues(tsData, glData, maybePayloadData = None) shouldBe NewValues.empty
}

"be None if ts and payload names are the same" in {

val tsData = tsDataExtracts().generateOne
val glData = glDataFrom(tsData).copy(name = projectNames.generateOne)
val payloadData = payloadDataFrom(tsData)

NewValuesCalculator.findNewValues(tsData, glData, payloadData.some) shouldBe NewValues.empty
}

"be gl name if ts and gl contains different names - no payload case" in {
"be gl name if ts and gl contains different names" in {

val tsData = tsDataExtracts().generateOne
val glData = glDataFrom(tsData).copy(name = projectNames.generateOne)

NewValuesCalculator.findNewValues(tsData, glData, maybePayloadData = None) shouldBe
NewValues.empty.copy(maybeName = glData.name.some)
}

"be payload name if all ts, gl and payload contains different names" in {

val tsData = tsDataExtracts().generateOne
val glData = glDataFrom(tsData).copy(name = projectNames.generateOne)
val payloadData = payloadDataFrom(tsData).copy(name = projectNames.generateOne)

NewValuesCalculator.findNewValues(tsData, glData, payloadData.some) shouldBe
NewValues.empty.copy(maybeName = payloadData.name.some)
}
}

"new visibility" should {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,7 @@ class PayloadDataExtractorSpec
(ioPayload >>=
(extractor.extractPayloadData(testProject.slug, _)))
.asserting(
_.value shouldBe DataExtract.Payload(testProject.slug,
testProject.name,
testProject.maybeDescription,
testProject.keywords,
testProject.images
)
_.value shouldBe DataExtract.Payload(testProject.maybeDescription, testProject.keywords, testProject.images)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = projectNames.generateOne
givenNewValuesFinding(tsData, glData, maybePayloadData, returning = NewValues.empty.copy(maybeName = newValue.some))
Expand All @@ -84,7 +84,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = projectVisibilities.generateOne
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -114,7 +114,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = projectModifiedDates(project.dateModified.value).generateSome
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -143,7 +143,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = projectDescriptions.generateSome
givenNewValuesFinding(tsData, glData, maybePayloadData, returning = NewValues.empty.copy(maybeDesc = newValue.some))
Expand Down Expand Up @@ -171,7 +171,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

givenNewValuesFinding(tsData, glData, maybePayloadData, returning = NewValues.empty.copy(maybeDesc = Some(None)))
val updatedTsData = tsData.copy(maybeDesc = None)
Expand All @@ -198,7 +198,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = projectKeywords.generateSet(min = 1)
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -230,7 +230,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = Set.empty[projects.Keyword]
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -259,7 +259,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = imageUris.generateList(min = 1)
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -291,7 +291,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = List.empty[Image]
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -320,7 +320,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

val newValue = projectKeywords.generateSet(min = 1)
givenNewValuesFinding(tsData,
Expand Down Expand Up @@ -349,7 +349,7 @@ class UpdateCommandsCalculatorSpec

val tsData = tsDataFrom(project)
val glData = glDataExtracts(project.slug).generateOne
val maybePayloadData = payloadDataExtracts(project.slug).generateOption
val maybePayloadData = payloadDataExtracts.generateOption

givenNewValuesFinding(tsData, glData, maybePayloadData, returning = NewValues.empty)

Expand Down