Skip to content

Commit

Permalink
refactor: Make Project.description typed
Browse files Browse the repository at this point in the history
  • Loading branch information
seakayone committed Nov 15, 2024
1 parent 804e35a commit 02f828c
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,15 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserProjectAdminM
import org.knora.webapi.messages.admin.responder.usersmessages.UserProjectMembershipsGetResponseADM
import org.knora.webapi.messages.admin.responder.usersmessages.UserResponseADM
import org.knora.webapi.messages.admin.responder.usersmessages.UsersGetResponseADM
import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2
import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol
import org.knora.webapi.slice.admin.api.model.Project
import org.knora.webapi.slice.admin.api.model.ProjectAdminMembersGetResponseADM
import org.knora.webapi.slice.admin.api.model.ProjectMembersGetResponseADM
import org.knora.webapi.slice.admin.api.model.ProjectOperationResponseADM
import org.knora.webapi.slice.admin.domain.model.Group
import org.knora.webapi.slice.admin.domain.model.KnoraProject.CopyrightAttribution
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Description
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Keyword
import org.knora.webapi.slice.admin.domain.model.KnoraProject.License
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Logo
Expand Down Expand Up @@ -206,6 +208,13 @@ object IntegrationTestAdminJsonProtocol extends TriplestoreJsonProtocol {
),
)

implicit object DescriptionFormat extends JsonFormat[Description] with TriplestoreJsonProtocol {
val lit = implicitly[JsonFormat[StringLiteralV2]]
override def write(obj: Description): JsValue = lit.write(obj.value)
override def read(json: JsValue): Description = Description
.from(lit.read(json))
.fold(err => throw DeserializationException(err), identity)
}
trait StringValueFormat[T <: StringValue] extends JsonFormat[T] { self =>
def from: String => Either[String, T]
override def write(v: T): JsValue = JsString(v.value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ object ProjectInfo {
shortname = project.shortname.value,
shortcode = project.shortcode.value,
longname = project.longname.map(_.value),
description = project.description.headOption.map(_.value),
description = project.description.map(_.value).headOption.map(_.value),
keywords = project.keywords.headOption.map(_ => project.keywords.mkString(", ")),
logo = project.logo.map(_.value),
ontologies = project.ontologies,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2
import org.knora.webapi.messages.util.KnoraSystemInstances
import org.knora.webapi.slice.admin.api.model.Project
import org.knora.webapi.slice.admin.domain.model.Group
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Description
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Keyword
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Logo
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Longname
Expand Down Expand Up @@ -166,7 +167,8 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("SystemProject"),
shortcode = Shortcode.unsafeFrom("FFFF"),
longname = Some(Longname.unsafeFrom("Knora System Project")),
description = Seq(StringLiteralV2.from(value = "Knora System Project", language = Some("en"))),
description =
List(StringLiteralV2.from(value = "Knora System Project", language = Some("en"))).map(Description.unsafeFrom),
keywords = List.empty,
logo = None,
ontologies = Seq(
Expand All @@ -187,7 +189,8 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("DefaultSharedOntologiesProject"),
shortcode = Shortcode.unsafeFrom("0000"),
longname = Some(Longname.unsafeFrom("Default Knora Shared Ontologies Project")),
description = Seq(StringLiteralV2.from(value = "Default Knora Shared Ontologies Project", language = Some("en"))),
description = List(StringLiteralV2.from(value = "Default Knora Shared Ontologies Project", language = Some("en")))
.map(Description.unsafeFrom),
keywords = List.empty,
logo = None,
ontologies = Seq.empty[IRI],
Expand Down Expand Up @@ -301,7 +304,8 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("images"),
shortcode = Shortcode.unsafeFrom("00FF"),
longname = Some(Longname.unsafeFrom("Image Collection Demo")),
description = Seq(StringLiteralV2.from(value = "A demo project of a collection of images", language = Some("en"))),
description = List(StringLiteralV2.from(value = "A demo project of a collection of images", language = Some("en")))
.map(Description.unsafeFrom),
keywords = List("images", "collection").map(Keyword.unsafeFrom),
logo = None,
ontologies = Seq(SharedOntologyTestDataADM.IMAGES_ONTOLOGY_IRI),
Expand All @@ -317,7 +321,8 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("images"),
shortcode = Shortcode.unsafeFrom("00FF"),
longname = Some(Longname.unsafeFrom("Image Collection Demo")),
description = Seq(StringLiteralV2.from(value = "A demo project of a collection of images", language = Some("en"))),
description = List(StringLiteralV2.from(value = "A demo project of a collection of images", language = Some("en")))
.map(Description.unsafeFrom),
keywords = List("images", "collection").map(Keyword.unsafeFrom),
logo = None,
ontologies = Seq(SharedOntologyTestDataADM.IMAGES_ONTOLOGY_IRI_LocalHost),
Expand Down Expand Up @@ -461,13 +466,13 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("incunabula"),
shortcode = Shortcode.unsafeFrom("0803"),
longname = Some(Longname.unsafeFrom("Bilderfolgen Basler Frühdrucke")),

Check warning on line 468 in integration/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

integration/src/test/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala#L468

Non ASCII characters are not allowed.
description = Seq(
description = List(
StringLiteralV2.from(
value =
"<p>Das interdisziplinäre Forschungsprojekt \"<b><em>Die Bilderfolgen der Basler Frühdrucke: Spätmittelalterliche Didaxe als Bild-Text-Lektüre</em></b>\" verbindet eine umfassende kunstwissenschaftliche Analyse der Bezüge zwischen den Bildern und Texten in den illustrierten Basler Inkunabeln mit der Digitalisierung der Bestände der Universitätsbibliothek und der Entwicklung einer elektronischen Edition in der Form einer neuartigen Web-0.2-Applikation.\n</p>\n<p>Das Projekt wird durchgeführt vom <a href=\"http://kunsthist.unibas.ch\">Kunsthistorischen Seminar</a> der Universität Basel (Prof. B. Schellewald) und dem <a href=\"http://www.dhlab.unibas.ch\">Digital Humanities Lab</a> der Universität Basel (PD Dr. L. Rosenthaler).\n</p>\n<p>\nDas Kernstück der digitalen Edition besteht aus rund zwanzig reich bebilderten Frühdrucken aus vier verschiedenen Basler Offizinen. Viele davon sind bereits vor 1500 in mehreren Ausgaben erschienen, einige fast gleichzeitig auf Deutsch und Lateinisch. Es handelt sich um eine ausserordentlich vielfältige Produktion; neben dem Heilsspiegel finden sich ein Roman, die Melusine, die Reisebeschreibungen des Jean de Mandeville, einige Gebets- und Erbauungsbüchlein, theologische Schriften, Fastenpredigten, die Leben der Heiligen Fridolin und Meinrad, das berühmte Narrenschiff sowie die Exempelsammlung des Ritters vom Thurn.\n</p>\nDie Internetpublikation macht das digitalisierte Korpus dieser Frühdrucke durch die Möglichkeiten nichtlinearer Verknüpfung und Kommentierung der Bilder und Texte, für die wissenschaftliche Edition sowie für die Erforschung der Bilder und Texte nutzbar machen. Auch können bereits bestehende und entstehende Online-Editionen damit verknüpft werden , wodurch die Nutzung von Datenbanken anderer Institutionen im Hinblick auf unser Corpus optimiert wird.\n</p>",
language = None,
),
),
).map(Description.unsafeFrom),
keywords = List(
"Basler Frühdrucke",
"Inkunabel",
Expand Down Expand Up @@ -498,13 +503,13 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("incunabula"),
shortcode = Shortcode.unsafeFrom("0803"),
longname = Some(Longname.unsafeFrom("Bilderfolgen Basler Frühdrucke")),
description = Seq(
description = List(
StringLiteralV2.from(
value =
"<p>Das interdisziplinäre Forschungsprojekt \"<b><em>Die Bilderfolgen der Basler Frühdrucke: Spätmittelalterliche Didaxe als Bild-Text-Lektüre</em></b>\" verbindet eine umfassende kunstwissenschaftliche Analyse der Bezüge zwischen den Bildern und Texten in den illustrierten Basler Inkunabeln mit der Digitalisierung der Bestände der Universitätsbibliothek und der Entwicklung einer elektronischen Edition in der Form einer neuartigen Web-0.2-Applikation.\n</p>\n<p>Das Projekt wird durchgeführt vom <a href=\"http://kunsthist.unibas.ch\">Kunsthistorischen Seminar</a> der Universität Basel (Prof. B. Schellewald) und dem <a href=\"http://www.dhlab.unibas.ch\">Digital Humanities Lab</a> der Universität Basel (PD Dr. L. Rosenthaler).\n</p>\n<p>\nDas Kernstück der digitalen Edition besteht aus rund zwanzig reich bebilderten Frühdrucken aus vier verschiedenen Basler Offizinen. Viele davon sind bereits vor 1500 in mehreren Ausgaben erschienen, einige fast gleichzeitig auf Deutsch und Lateinisch. Es handelt sich um eine ausserordentlich vielfältige Produktion; neben dem Heilsspiegel finden sich ein Roman, die Melusine, die Reisebeschreibungen des Jean de Mandeville, einige Gebets- und Erbauungsbüchlein, theologische Schriften, Fastenpredigten, die Leben der Heiligen Fridolin und Meinrad, das berühmte Narrenschiff sowie die Exempelsammlung des Ritters vom Thurn.\n</p>\nDie Internetpublikation macht das digitalisierte Korpus dieser Frühdrucke durch die Möglichkeiten nichtlinearer Verknüpfung und Kommentierung der Bilder und Texte, für die wissenschaftliche Edition sowie für die Erforschung der Bilder und Texte nutzbar machen. Auch können bereits bestehende und entstehende Online-Editionen damit verknüpft werden , wodurch die Nutzung von Datenbanken anderer Institutionen im Hinblick auf unser Corpus optimiert wird.\n</p>",
language = None,
),
),
).map(Description.unsafeFrom),
keywords = List(
"Basler Frühdrucke",
"Inkunabel",
Expand Down Expand Up @@ -633,7 +638,7 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("anything"),
shortcode = Shortcode.unsafeFrom("0001"),
longname = Some(Longname.unsafeFrom("Anything Project")),
description = Seq(StringLiteralV2.from(value = "Anything Project", language = None)),
description = List(StringLiteralV2.from(value = "Anything Project", language = None)).map(Description.unsafeFrom),
keywords = List("things", "arbitrary test data").map(Keyword.unsafeFrom),
logo = None,
ontologies = Seq(SharedOntologyTestDataADM.ANYTHING_ONTOLOGY_IRI, SharedOntologyTestDataADM.SomethingOntologyIri),
Expand All @@ -648,7 +653,7 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("anything"),
shortcode = Shortcode.unsafeFrom("0001"),
longname = Some(Longname.unsafeFrom("Anything Project")),
description = Seq(StringLiteralV2.from(value = "Anything Project", language = None)),
description = List(StringLiteralV2.from(value = "Anything Project", language = None)).map(Description.unsafeFrom),
keywords = List("things", "arbitrary test data").map(Keyword.unsafeFrom),
logo = None,
ontologies = Seq(
Expand Down Expand Up @@ -685,7 +690,8 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("beol"),
shortcode = Shortcode.unsafeFrom("0801"),
longname = Some(Longname.unsafeFrom("Bernoulli-Euler Online")),
description = Seq(StringLiteralV2.from(value = "Bernoulli-Euler Online", language = None)),
description =
List(StringLiteralV2.from(value = "Bernoulli-Euler Online", language = None)).map(Description.unsafeFrom),
keywords = List.empty,
logo = None,
ontologies = Seq(
Expand Down Expand Up @@ -741,7 +747,7 @@ object SharedTestDataADM {
shortname = Shortname.unsafeFrom("dokubib"),
shortcode = Shortcode.unsafeFrom("0804"),
longname = Some(Longname.unsafeFrom("Dokubib")),
description = Seq(StringLiteralV2.from(value = "Dokubib", language = None)),
description = List(StringLiteralV2.from(value = "Dokubib", language = None)).map(Description.unsafeFrom),
keywords = List.empty,
logo = None,
ontologies = Seq("http://www.knora.org/ontology/0804/dokubib"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.knora.webapi.slice.admin.domain.model.GroupName
import org.knora.webapi.slice.admin.domain.model.GroupSelfJoin
import org.knora.webapi.slice.admin.domain.model.GroupStatus
import org.knora.webapi.slice.admin.domain.model.KnoraProject.CopyrightAttribution
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Description
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Keyword
import org.knora.webapi.slice.admin.domain.model.KnoraProject.License
import org.knora.webapi.slice.admin.domain.model.KnoraProject.Longname
Expand Down Expand Up @@ -95,7 +96,7 @@ object Examples {
shortname = Shortname.unsafeFrom("example"),
shortcode = Shortcode.unsafeFrom("0001"),
longname = Some(Longname.unsafeFrom("Example Project")),
description = Seq(StringLiteralV2.from("An example project", Some("en"))),
description = List(StringLiteralV2.from("An example project", Some("en"))).map(Description.unsafeFrom),
keywords = List("example", "project").map(Keyword.unsafeFrom),
logo = None,
status = Active,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import zio.json.JsonCodec

import org.knora.webapi.IRI
import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM
import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2
import org.knora.webapi.slice.admin.api.Codecs.ZioJsonCodec.*
import org.knora.webapi.slice.admin.domain.model.KnoraProject.*
import org.knora.webapi.slice.admin.domain.model.RestrictedView
Expand All @@ -35,7 +34,7 @@ case class Project(
shortname: Shortname,
shortcode: Shortcode,
longname: Option[Longname],
description: Seq[StringLiteralV2],
description: List[Description],
keywords: List[Keyword],
logo: Option[Logo],
ontologies: Seq[IRI],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ final case class ProjectService(
knoraProject.shortname,
knoraProject.shortcode,
knoraProject.longname,
knoraProject.description.map(_.value),
knoraProject.description.toList,
knoraProject.keywords,
knoraProject.logo,
ontologies,
Expand All @@ -67,9 +67,7 @@ final case class ProjectService(
shortname = project.shortname,
shortcode = project.shortcode,
longname = project.longname,
description = NonEmptyChunk
.fromIterable(project.description.head, project.description.tail)
.map(Description.unsafeFrom),
description = NonEmptyChunk.fromIterable(project.description.head, project.description.tail),
keywords = project.keywords,
logo = project.logo,
status = project.status,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ object ProjectServiceSpec extends ZIOSpecDefault {
shortname = shortname,
shortcode = shortcode,
longname = None,
description = List(StringLiteralV2.from("description not used in test", None)),
description = List(StringLiteralV2.from("description not used in test", None)).map(Description.unsafeFrom),
keywords = List.empty,
logo = None,
ontologies = List.empty,
Expand Down

0 comments on commit 02f828c

Please sign in to comment.