Skip to content

Commit

Permalink
Fix scalapb-validate setup instructions by bumping sbt-protoc (#1264)
Browse files Browse the repository at this point in the history
* move scalapb-validation sbt instructions to scripted

* bump sbt-protoc for better integration with common-protos

Fixes scripted 10-scalapb-validate, see
* scalapb/ScalaPB#873 (comment)
* scalapb/scalapb-validate#70

Other changes
* cacheClassLoaders is now deprecated, see
  thesamet/sbt-protoc@2a730a4
* Forcing recompilation is no longer necessary as the cache gets
  invalidated if a sandbox genererator classpath is updated, see
  thesamet/sbt-protoc@80824b0
* The new classloader caching implementation resolves sandboxed
  generators artifacts earlier, even if they are no sources. That is
  the case for Test / protocGenerate, which was starting before
  codeGenProject / Compile / publishLocal, causing:
  > Error downloading com.lightbend.akka.grpc:akka-grpc-codegen_2.12:
  > 1.1.0-5-c5975cd5

* demonstrate usage of validate_at_construction

Requires scalapb/scalapb-validate@8529a55
  • Loading branch information
github-brice-jaglin authored Feb 17, 2021
1 parent b667ab9 commit 0288da3
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 14 deletions.
2 changes: 1 addition & 1 deletion benchmark-java/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ val root = project.in(file("."))
"org.scalatest" %% "scalatest" % "3.1.2" % "test",
"org.scalatestplus" %% "junit-4-12" % "3.1.2.0" % "test"
),
Compile / PB.generate := ((Compile / PB.generate) dependsOn (
PB.artifactResolver := (PB.artifactResolver dependsOn (
codeGenProject / Compile / publishLocal)).value
)

Expand Down
10 changes: 1 addition & 9 deletions docs/src/main/paradox/apidesign.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,7 @@ Follow the [documentation](https://scalapb.github.io/docs/validation) to update
in order to generate the validators using `sbt-protoc` (@ref[used by Akka gRPC](buildtools/sbt.md#sbt-protoc-settings)).

With the default parameters and target set by Akka gRPC, additions to your `build.sbt` should be:
```scala
import scalapb.GeneratorOption._

libraryDependencies +=
"com.thesamet.scalapb" %% "scalapb-validate-core" % scalapb.validate.compiler.BuildInfo.version % "protobuf"

Compile / PB.targets +=
scalapb.validate.gen(FlatPackage) -> (Compile / akkaGrpcCodeGeneratorSettings / target).value
```
@@snip[build.sbt](/sbt-plugin/src/sbt-test/gen-scala-server/10-scalapb-validate/build.sbt) { #setup }

The `validate_at_construction` option can be particularly interesting in a server-side context
since method implementations will automatically receive pre-validated requests and will not
Expand Down
3 changes: 0 additions & 3 deletions project/ReflectiveCodeGen.scala
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@ object ReflectiveCodeGen extends AutoPlugin {
}
}
}.value,
// Reload generators on each invocation
PB.cacheClassLoaders := false,
setCodeGenerator := loadAndSetGenerator(
// the magic sauce: use the output classpath from the the sbt-plugin project and instantiate generators from there
(fullClasspath in Compile in ProjectRef(file("."), "sbt-akka-grpc")).value,
Expand All @@ -76,7 +74,6 @@ object ReflectiveCodeGen extends AutoPlugin {
codeGeneratorSettings.value,
PB.targets.value.asInstanceOf[ListBuffer[Target]],
scalaBinaryVersion.value),
PB.recompile ~= (_ => true),
PB.protoSources in Compile := PB.protoSources.value ++ Seq(
PB.externalIncludePath.value,
sourceDirectory.value / "proto"))) ++ Seq(
Expand Down
2 changes: 1 addition & 1 deletion project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
enablePlugins(BuildInfoPlugin)

val sbtProtocV = "1.0.0"
val sbtProtocV = "1.0.1"

buildInfoKeys := Seq[BuildInfoKey]("sbtProtocVersion" -> sbtProtocV)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
resolvers += Resolver.sonatypeRepo("staging")
resolvers += Resolver.bintrayRepo("akka", "snapshots")

//#setup
import scalapb.GeneratorOption._

enablePlugins(AkkaGrpcPlugin)

libraryDependencies +=
"com.thesamet.scalapb" %% "scalapb-validate-core" % scalapb.validate.compiler.BuildInfo.version % "protobuf"
Compile / PB.targets +=
scalapb.validate.gen(FlatPackage) -> (Compile / akkaGrpcCodeGeneratorSettings / target).value
//#setup
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % sys.props("project.version"))

libraryDependencies ++= Seq("com.thesamet.scalapb" %% "scalapb-validate-codegen" % "0.2.2")
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
syntax = "proto3";

option java_package = "example.myapp.helloworld.grpc";

package helloworld;

import "validate/validate.proto";
import "scalapb/scalapb.proto";
import "scalapb/validate.proto";

option (scalapb.options) = {
scope: FILE
[scalapb.validate.file] {
validate_at_construction: true
insert_validator_instance: false
}
};

// The greeting service definition.
service GreeterService {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}

rpc ItKeepsTalking (stream HelloRequest) returns (HelloReply) {}

rpc ItKeepsReplying (HelloRequest) returns (stream HelloReply) {}

rpc StreamHellos (stream HelloRequest) returns (stream HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
string name = 1 [(validate.rules).string.min_len = 3];;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package example.myapp

import scala.util.{Failure, Success, Try}
import scalapb.validate._

import example.myapp.helloworld.grpc.HelloRequest

object Main extends App {

Try(HelloRequest("valid")) match {
case Success(_) => // expected
case Failure(e) => throw new RuntimeException("unexpected violations for \"valid\"", e)
}

Try(HelloRequest("ko")) match {
case Success(_) => throw new RuntimeException("unexpected success for \"ko\"")
case Failure(e) => // expected
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package example.myapp.helloworld

import scala.concurrent.Future

import akka.NotUsed
import akka.stream.scaladsl.Source

import example.myapp.helloworld.grpc._

class GreeterServiceImpl extends GreeterService {
override def sayHello(in: HelloRequest): Future[HelloReply] = ???

override def streamHellos(in: Source[HelloRequest, NotUsed]): Source[HelloReply, NotUsed] = ???

override def itKeepsTalking(in: Source[HelloRequest, NotUsed]): Future[HelloReply] = ???

override def itKeepsReplying(in: HelloRequest): Source[HelloReply, NotUsed] = ???

}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
> run

0 comments on commit 0288da3

Please sign in to comment.