Skip to content

Commit 2e5d030

Browse files
committed
1.30.0
1 parent 575e655 commit 2e5d030

File tree

17 files changed

+58
-184
lines changed

17 files changed

+58
-184
lines changed

project/Common.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ object Common {
1010
val useLatest = false
1111

1212
object Versions {
13-
val app = "1.29.3"
13+
val app = "1.30.0"
1414
val scala212 = "2.12.10"
1515
val scala213 = "2.13.1"
1616
}

projectile-export/src/main/scala/com/kyleu/projectile/models/feature/controller/db/ControllerMutations.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ object ControllerMutations {
2626
file.add(s"""val pks = form("primaryKeys").split("//").map(_.trim).filter(_.nonEmpty).map($split).toList""")
2727
model.pkFields match {
2828
case h :: Nil =>
29-
file.add(s"""val typed = pks.map(pk => ${FieldTypeFromString.fromString(config, h.t, "pk.head")})""")
29+
file.add(s"""val typed = pks.map(pk => ${FieldTypeFromString.fromString(config, h.t, "pk.headOption.getOrElse(throw new IllegalStateException())")})""")
3030
case pks =>
3131
val pkString = pks.zipWithIndex.map { pk =>
3232
val ref = pk._2 match {
33-
case 0 => "pk.head"
33+
case 0 => "pk.headOption.getOrElse(throw new IllegalStateException())"
3434
case i => s"pk($i)"
3535
}
3636
FieldTypeFromString.fromString(config, pk._1.t, ref)

projectile-export/src/main/scala/com/kyleu/projectile/models/feature/core/thrift/ThriftUnionFile.scala

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ object ThriftUnionFile {
1818

1919
file.add(s"object ${union.className} {", 1)
2020
addFields(config, union, file)
21+
file.add(s"case object UnknownVariant extends ${union.className} {", 1)
22+
file.add(s"override def asThrift = throw new IllegalStateException()")
23+
file.add("}", -1)
2124
file.add()
22-
2325
config.addCommonImport(file, "JsonSerializers", "_")
2426
file.add(s"implicit val jsonEncoder: Encoder[${union.className}] = deriveEncoder")
2527
file.add(s"implicit val jsonDecoder: Decoder[${union.className}] = deriveDecoder")
@@ -32,7 +34,7 @@ object ThriftUnionFile {
3234
}
3335
file.add(s"case $tc.${t.className}(x) => ${t.className}($cn.fromThrift(x))")
3436
}
35-
file.add(s"""case $tc.UnknownUnionField(_) => throw new IllegalStateException("Unknown union field")""")
37+
file.add(s"""case $tc.UnknownUnionField(_) => UnknownVariant""")
3638
file.add("}", -1)
3739
file.add("}", -1)
3840

projectile-export/src/main/scala/com/kyleu/projectile/models/feature/service/db/ServiceInserts.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ object ServiceInserts {
5656
file.add(s"""traceF("insert")(td => db.queryF($queriesFilename.insert(model), conn)(td).flatMap {""", 1)
5757
config.addCommonImport(file, "DatabaseFieldType")
5858
val coerced = model.pkFields.zipWithIndex.map { pk =>
59-
val ref = if (pk._2 == 0) { "pks.head" } else { s"pks(${pk._2}" }
59+
val ref = if (pk._2 == 0) { "pks.headOption.getOrElse(throw new IllegalStateException())" } else { s"pks(${pk._2}" }
6060
s"DatabaseFieldType.${QueriesHelper.classNameForSqlType(pk._1.t, config)}.coerce($ref)"
6161
}.mkString(", ")
6262
if (model.features(ModelFeature.Audit)) {
@@ -94,7 +94,7 @@ object ServiceInserts {
9494
def createSerial(config: ExportConfiguration, file: ScalaFile, model: ExportModel, queriesFilename: String) = {
9595
file.add(s"""traceF("create")(td => db.queryF($queriesFilename.create(fields), conn)(td).flatMap {""", 1)
9696
val coerced = model.pkFields.zipWithIndex.map { pk =>
97-
val ref = if (pk._2 == 0) { "pks.head" } else { s"pks(${pk._2}" }
97+
val ref = if (pk._2 == 0) { "pks.headOption.getOrElse(throw new IllegalStateException())" } else { s"pks(${pk._2}" }
9898
s"DatabaseFieldType.${QueriesHelper.classNameForSqlType(pk._1.t, config)}.coerce($ref)"
9999
}.mkString(", ")
100100
model.pkFields match {

projectile-export/src/main/scala/com/kyleu/projectile/models/feature/slick/TableHelper.scala

+24-20
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.kyleu.projectile.models.database.schema.ForeignKey
44
import com.kyleu.projectile.models.export.ExportModel
55
import com.kyleu.projectile.models.export.config.ExportConfiguration
66
import com.kyleu.projectile.models.export.typ.FieldType
7+
import com.kyleu.projectile.models.feature.ModelFeature
78
import com.kyleu.projectile.models.output.ExportHelper
89
import com.kyleu.projectile.models.output.file.ScalaFile
910

@@ -64,30 +65,33 @@ object TableHelper {
6465
}
6566
}
6667

67-
def addExtensions(config: ExportConfiguration, file: ScalaFile, model: ExportModel) = if (model.foreignKeys.nonEmpty) {
68-
file.addImport(Seq("scala", "language"), "higherKinds")
69-
file.add()
70-
file.add(s"implicit class ${model.className}TableExtensions[C[_]](q: Query[${model.className}Table, ${model.className}, C]) {", 1)
71-
model.foreignKeys.groupBy(_.targetTable).toList.foreach { fk =>
72-
val target = config.getModel(fk._1, "tableExtensions")
73-
file.addImport(target.slickPackage(config), target.className + "Table")
68+
def addExtensions(config: ExportConfiguration, file: ScalaFile, model: ExportModel) = {
69+
val keys = model.foreignKeys.filter(fk => config.models.exists(m => m.key == fk.targetTable && m.features(ModelFeature.Slick)))
70+
if (keys.nonEmpty) {
71+
file.addImport(Seq("scala", "language"), "higherKinds")
72+
file.add()
73+
file.add(s"implicit class ${model.className}TableExtensions[C[_]](q: Query[${model.className}Table, ${model.className}, C]) {", 1)
74+
keys.groupBy(_.targetTable).toList.foreach { fk =>
75+
val target = config.getModel(fk._1, "tableExtensions")
76+
file.addImport(target.slickPackage(config), target.className + "Table")
7477

75-
def proc(fk: ForeignKey, key: String) = fk.references match {
76-
case ref :: Nil =>
77-
val srcCol = model.getField(ref.source)
78-
val tgtCol = target.getField(ref.target)
79-
file.add(s"def with$key = q.join(${target.className}Table.query).on(_.${srcCol.propertyName} === _.${tgtCol.propertyName})")
80-
file.add(s"def with${key}Opt = q.joinLeft(${target.className}Table.query).on(_.${srcCol.propertyName} === _.${tgtCol.propertyName})")
81-
case _ => // noop
82-
}
78+
def proc(fk: ForeignKey, key: String) = fk.references match {
79+
case ref :: Nil =>
80+
val srcCol = model.getField(ref.source)
81+
val tgtCol = target.getField(ref.target)
82+
file.add(s"def with$key = q.join(${target.className}Table.query).on(_.${srcCol.propertyName} === _.${tgtCol.propertyName})")
83+
file.add(s"def with${key}Opt = q.joinLeft(${target.className}Table.query).on(_.${srcCol.propertyName} === _.${tgtCol.propertyName})")
84+
case _ => // noop
85+
}
8386

84-
fk._2 match {
85-
case solo :: Nil => proc(solo, target.className)
86-
case multiple => multiple.foreach { m =>
87-
proc(m, s"${target.className}By${ExportHelper.toClassName(m.references.headOption.getOrElse(throw new IllegalStateException()).source)}")
87+
fk._2 match {
88+
case solo :: Nil => proc(solo, target.className)
89+
case multiple => multiple.foreach { m =>
90+
proc(m, s"${target.className}By${ExportHelper.toClassName(m.references.headOption.getOrElse(throw new IllegalStateException()).source)}")
91+
}
8892
}
8993
}
94+
file.add("}", -1)
9095
}
91-
file.add("}", -1)
9296
}
9397
}

projectile-export/src/main/scala/com/kyleu/projectile/services/project/EnumMemberService.scala

+4-6
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ class EnumMemberService(val svc: ProjectileService) {
2525
private[this] def saveMember(p: String, i: Input, member: EnumMember) = {
2626
val o = i.enum(member.key)
2727
val m = o.apply(member)
28-
if (o != m) {
29-
val dir = svc.configForProject(p).projectDir(p)
30-
val f = fileFor(dir, member.key)
31-
f.createFileIfNotExists(createParents = true)
32-
f.overwrite(JacksonUtils.printJackson(member.asJson))
33-
}
28+
val dir = svc.configForProject(p).projectDir(p)
29+
val f = fileFor(dir, member.key)
30+
f.createFileIfNotExists(createParents = true)
31+
f.overwrite(JacksonUtils.printJackson(member.asJson))
3432
m
3533
}
3634
}

projectile-export/src/main/scala/com/kyleu/projectile/services/project/ModelMemberService.scala

+4-6
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ class ModelMemberService(val svc: ProjectileService) {
2525
private[this] def saveMember(p: String, i: Input, member: ModelMember) = {
2626
val o = i.model(member.key)
2727
val m = o.apply(member)
28-
if (o != m) {
29-
val dir = svc.configForProject(p).projectDir(p)
30-
val f = fileFor(dir, member.key)
31-
f.createFileIfNotExists(createParents = true)
32-
f.overwrite(JacksonUtils.printJackson(member.asJson))
33-
}
28+
val dir = svc.configForProject(p).projectDir(p)
29+
val f = fileFor(dir, member.key)
30+
f.createFileIfNotExists(createParents = true)
31+
f.overwrite(JacksonUtils.printJackson(member.asJson))
3432
m
3533
}
3634
}

projectile-export/src/main/scala/com/kyleu/projectile/services/project/ServiceMemberService.scala

+4-6
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ class ServiceMemberService(val svc: ProjectileService) {
2525
private[this] def saveMember(p: String, i: Input, member: ServiceMember) = {
2626
val o = i.service(member.key)
2727
val m = o.apply(member)
28-
if (o != m) {
29-
val dir = svc.configForProject(p).projectDir(p)
30-
val f = fileFor(dir, member.key)
31-
f.createFileIfNotExists(createParents = true)
32-
f.overwrite(JacksonUtils.printJackson(member.asJson))
33-
}
28+
val dir = svc.configForProject(p).projectDir(p)
29+
val f = fileFor(dir, member.key)
30+
f.createFileIfNotExists(createParents = true)
31+
f.overwrite(JacksonUtils.printJackson(member.asJson))
3432
m
3533
}
3634
}

projectile-export/src/main/scala/com/kyleu/projectile/services/project/UnionMemberService.scala

+4-6
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ class UnionMemberService(val svc: ProjectileService) {
2525
private[this] def saveMember(p: String, i: Input, member: UnionMember) = {
2626
val o = i.union(member.key)
2727
val m = o.apply(member)
28-
if (o != m) {
29-
val dir = svc.configForProject(p).projectDir(p)
30-
val f = fileFor(dir, member.key)
31-
f.createFileIfNotExists(createParents = true)
32-
f.overwrite(JacksonUtils.printJackson(member.asJson))
33-
}
28+
val dir = svc.configForProject(p).projectDir(p)
29+
val f = fileFor(dir, member.key)
30+
f.createFileIfNotExists(createParents = true)
31+
f.overwrite(JacksonUtils.printJackson(member.asJson))
3432
m
3533
}
3634
}

projectile-export/src/test/scala/services/ProjectileServiceTests.scala

-124
This file was deleted.

sandbox/app/controllers/admin/b/BottomRowController.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class BottomRowController @javax.inject.Inject() (
108108
def bulkEdit = withSession("bulk.edit", ("b", "BottomRow", "edit")) { implicit request => implicit td =>
109109
val form = ControllerUtils.getForm(request.body)
110110
val pks = form("primaryKeys").split("//").map(_.trim).filter(_.nonEmpty).map(_.split("---").map(_.trim).filter(_.nonEmpty).toList).toList
111-
val typed = pks.map(pk => UUID.fromString(pk.head))
111+
val typed = pks.map(pk => UUID.fromString(pk.headOption.getOrElse(throw new IllegalStateException())))
112112
val changes = modelForm(request.body)
113113
svc.updateBulk(request, typed, changes).map(msg => Ok("OK: " + msg))
114114
}

sandbox/app/controllers/admin/size/BigRowController.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class BigRowController @javax.inject.Inject() (
106106
def bulkEdit = withSession("bulk.edit", ("size", "BigRow", "edit")) { implicit request => implicit td =>
107107
val form = ControllerUtils.getForm(request.body)
108108
val pks = form("primaryKeys").split("//").map(_.trim).filter(_.nonEmpty).map(_.split("---").map(_.trim).filter(_.nonEmpty).toList).toList
109-
val typed = pks.map(pk => pk.head.toLong)
109+
val typed = pks.map(pk => pk.headOption.getOrElse(throw new IllegalStateException()).toLong)
110110
val changes = modelForm(request.body)
111111
svc.updateBulk(request, typed, changes).map(msg => Ok("OK: " + msg))
112112
}

sandbox/app/controllers/admin/size/SmallRowController.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class SmallRowController @javax.inject.Inject() (
106106
def bulkEdit = withSession("bulk.edit", ("size", "SmallRow", "edit")) { implicit request => implicit td =>
107107
val form = ControllerUtils.getForm(request.body)
108108
val pks = form("primaryKeys").split("//").map(_.trim).filter(_.nonEmpty).map(_.split("---").map(_.trim).filter(_.nonEmpty).toList).toList
109-
val typed = pks.map(pk => pk.head.toLong)
109+
val typed = pks.map(pk => pk.headOption.getOrElse(throw new IllegalStateException()).toLong)
110110
val changes = modelForm(request.body)
111111
svc.updateBulk(request, typed, changes).map(msg => Ok("OK: " + msg))
112112
}

sandbox/app/controllers/admin/t/TopRowController.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class TopRowController @javax.inject.Inject() (
108108
def bulkEdit = withSession("bulk.edit", ("t", "TopRow", "edit")) { implicit request => implicit td =>
109109
val form = ControllerUtils.getForm(request.body)
110110
val pks = form("primaryKeys").split("//").map(_.trim).filter(_.nonEmpty).map(_.split("---").map(_.trim).filter(_.nonEmpty).toList).toList
111-
val typed = pks.map(pk => UUID.fromString(pk.head))
111+
val typed = pks.map(pk => UUID.fromString(pk.headOption.getOrElse(throw new IllegalStateException())))
112112
val changes = modelForm(request.body)
113113
svc.updateBulk(request, typed, changes).map(msg => Ok("OK: " + msg))
114114
}

sandbox/app/models/sandbox/TestbedTask.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ object TestbedTask extends SandboxTask("testbed", "Testbed", "Just new boot goof
1616
if (csv.isEmpty) {
1717
Future.successful(Json.fromString("No rows available"))
1818
} else {
19-
val (cols, data) = csv.head -> csv.tail
19+
val (cols, data) = csv.headOption.getOrElse(throw new IllegalStateException()) -> csv.drop(1)
2020
val result = process(cols, data)
2121
Future.successful(Json.fromString(s"$result: Processed [${csv.size}] rows..."))
2222
}

sandbox/app/services/size/BigRowService.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class BigRowService @javax.inject.Inject() (val db: JdbcDatabase, override val t
8989
// Mutations
9090
def insert(creds: Credentials, model: BigRow, conn: Option[Connection] = None)(implicit trace: TraceData) = checkPerm(creds, "edit") {
9191
traceF("insert")(td => db.queryF(BigRowQueries.insert(model), conn)(td).flatMap {
92-
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.head), conn)(td).map(_.map { n =>
92+
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.headOption.getOrElse(throw new IllegalStateException())), conn)(td).map(_.map { n =>
9393
AuditHelper.onInsert("BigRow", Seq(n.id.toString), n.toDataFields, creds)
9494
n
9595
})
@@ -108,7 +108,7 @@ class BigRowService @javax.inject.Inject() (val db: JdbcDatabase, override val t
108108
}
109109
def create(creds: Credentials, fields: Seq[DataField], conn: Option[Connection] = None)(implicit trace: TraceData) = checkPerm(creds, "edit") {
110110
traceF("create")(td => db.queryF(BigRowQueries.create(fields), conn)(td).flatMap {
111-
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.head), conn)(td).map(_.map { n =>
111+
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.headOption.getOrElse(throw new IllegalStateException())), conn)(td).map(_.map { n =>
112112
AuditHelper.onInsert("BigRow", Seq(n.id.toString), n.toDataFields, creds)
113113
n
114114
})

sandbox/app/services/size/SmallRowService.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class SmallRowService @javax.inject.Inject() (val db: JdbcDatabase, override val
104104
// Mutations
105105
def insert(creds: Credentials, model: SmallRow, conn: Option[Connection] = None)(implicit trace: TraceData) = checkPerm(creds, "edit") {
106106
traceF("insert")(td => db.queryF(SmallRowQueries.insert(model), conn)(td).flatMap {
107-
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.head), conn)(td)
107+
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.headOption.getOrElse(throw new IllegalStateException())), conn)(td)
108108
case _ => throw new IllegalStateException("Unable to find newly-inserted Small")
109109
})
110110
}
@@ -120,7 +120,7 @@ class SmallRowService @javax.inject.Inject() (val db: JdbcDatabase, override val
120120
}
121121
def create(creds: Credentials, fields: Seq[DataField], conn: Option[Connection] = None)(implicit trace: TraceData) = checkPerm(creds, "edit") {
122122
traceF("create")(td => db.queryF(SmallRowQueries.create(fields), conn)(td).flatMap {
123-
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.head), conn)(td)
123+
case Some(pks) => getByPrimaryKey(creds, DatabaseFieldType.LongType.coerce(pks.headOption.getOrElse(throw new IllegalStateException())), conn)(td)
124124
case _ => throw new IllegalStateException("Unable to find newly-inserted Small")
125125
})
126126
}

0 commit comments

Comments
 (0)