Managing Binary Compatibility in Scala (Scala Lift Off 2011)
Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2;...
Transcript of Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2;...
![Page 1: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/1.jpg)
Making most of ScalaAkka, Scala, Spray, Specs2; all in 50 minutes!
![Page 2: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/2.jpg)
Jan Machacek• Chief whip at Cake Solutions
• Author of Pro Spring, Pro Spring 2.5 and other books & articles
• Contributor to Akka Patterns, Specs2 Spring, Scalad, Spring Extensions, Spock Spring Integration
• Editor of the Open Source Journal
• @honzam399, github.com/janm399, [email protected]
![Page 3: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/3.jpg)
Brings all together
• Object oriented languageEverything is an object: even 1, true, ...; mixin composition (multiple implementation inheritance with terms & conditions)
• Functional programming constructsEven a function is object that can be bound to a variable, passed as argument
• Static typing and pattern matchingCompiler infers & enforces type safety;
• Compiles to Java bytecodeAdopt Scala slowly, don’t throw away your existing Java code
![Page 4: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/4.jpg)
Heavy lifting to DSLs
• Use Scala to implement the most complex codeJava of the future: everything in Java, functions, traits, pattern matching; rich type inference
• Use Scala to implement the ordinary codeTypical programming tasks can be done with much less syntactical noise
• Use Scala for DSLsIt is easy to design & implement statically typed DSLs
![Page 5: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/5.jpg)
Let’s build something
• A proper e-commerce app, where you must create an account when you want to buy a widget for £10, giving your date of birth, a letter from the hospital in which your mother was born, ...; then receive text message with an activation code.
Only to find out that they don’t deliver to your work address
![Page 6: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/6.jpg)
Let’s build something
• We’ll do a HTTP POST with a JSON document that can be mapped onto the User instance
• Unmarshal the JSON document
• Register the user and send the activation code
• Marshal the instance of the reply (succeeded, failed) into a JSON document
![Page 7: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/7.jpg)
Let’s build something
Depends on
Composes
Instantiates
Io
Core Api Web
Application
Main
![Page 8: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/8.jpg)
The componentstrait ServerCore { implicit def actorSystem: ActorSystem
implicit val timeout = Timeout(30000)
val core = actorSystem.actorOf( Props[ApplicationActor], "application") Await.ready(core ? Start(), timeout.duration)}
![Page 9: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/9.jpg)
The componentstrait HttpIO { implicit def actorSystem: ActorSystem lazy val ioBridge = IOExtension(actorSystem).ioBridge
private lazy val httpClient: ActorRef = actorSystem.actorOf(Props(new HttpClient(ioBridge)))
def makeConduit(host: String): ActorRef = actorSystem.actorOf(Props(new HttpConduit( httpClient, host, port = 443, sslEnabled = true)))
}
![Page 10: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/10.jpg)
The componentstrait HttpIO { implicit def actorSystem: ActorSystem lazy val ioBridge = IOExtension(actorSystem).ioBridge
private lazy val httpClient: ActorRef = actorSystem.actorOf(Props(new HttpClient(ioBridge)))
def makeConduit(host: String): ActorRef = actorSystem.actorOf(Props(new HttpConduit( httpClient, host, port = 443, sslEnabled = true)))
}
trait ActorHttpIO extends HttpIO { this: Actor =>
final implicit def actorSystem = context.system}
![Page 11: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/11.jpg)
The componentstrait Api extends RouteConcatenation { this: ServerCore =>
val routes = new HomeService().route ~ new UserService().route
val rootService = actorSystem.actorOf(Props( new RoutedHttpService(routes)))
}
![Page 12: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/12.jpg)
The componentstrait Web extends HttpIO { this: Api with ServerCore =>
val httpServer = actorSystem.actorOf(Props( new HttpServer(ioBridge, SingletonHandler(rootService))), name = "http-server" )
httpServer ! HttpServer.Bind("localhost", 8080)
}
![Page 13: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/13.jpg)
The components
trait ServerCore { implicit def actorSystem: ActorSystem ...}
trait Api { this: ServerCore => ...}
trait Web { this: Api with ServerCore => ...}
class Application(val actorSystem: ActorSystem) extends Apiclass Application(val actorSystem: ActorSystem) extends Web class Application(val actorSystem: ActorSystem) extends Api with Web
class Application(val actorSystem: ActorSystem) extends ServerCore with Api with Web
![Page 14: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/14.jpg)
The components
object Main extends App { val system = ActorSystem("AkkaPatterns")
class Application(val actorSystem: ActorSystem) extends
ServerCore with Api with Web
new Application(system)}
trait ServerCore { implicit def actorSystem: ActorSystem ...}
![Page 15: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/15.jpg)
Let’s build something
Io
Core Api Web
Application
Main
![Page 16: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/16.jpg)
Let’s build something
Application {
POST /users (ru: RegisterUser) → 422: Failure 200: RegistedUser
GET /users/{UserReference} → 404: None 200: Some(User)
}
![Page 17: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/17.jpg)
The componentstrait Api extends RouteConcatenation { this: ServerCore =>
val routes = new HomeService().route ~ new UserService().route
val rootService = actorSystem.actorOf(Props( new RoutedHttpService(routes)))
}
val route = path("users") { post { handleWith { ru: RegisterUser => (userRegistrationActor ? ru).mapTo[ Either[ApplicationFailure, RegisteredUser]] } } }
![Page 18: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/18.jpg)
A message!class UserService(implicit val actorSystem: ActorSystem) extends Directives with UserServiceMarshallers with DefaultTimeout {
def userRegistrationActor = actorSystem.actorFor("/user/application/registration")
val route = path("users") { post { handleWith { ru: RegisterUser => (userActor ? ru).mapTo[ Either[ApplicationFailure, RegisteredUser]] } } }
}
![Page 19: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/19.jpg)
A message!case class RegisterUser( username: String, password: String, email: String, mobile: String)
![Page 20: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/20.jpg)
A message!case class RegisterUser( username: String, password: String, email: EmailAddress, mobile: MobileNumber)
sealed trait Address
case class EmailAddress(address: String) extends Address
case class MobileNumber(number: String) extends Address
![Page 21: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/21.jpg)
A message!case class RegisterUser( username: String, password: String, email: EmailAddress, mobile: MobileNumber)
sealed trait Address
case class EmailAddress(address: String) extends Address
case class MobileNumber(number: String) extends Address
case class RegisteredUser(user: User)
trait ApplicationFailure
case class ValidationFailed(…) extends ApplicationFailurecase object UsernameTaken extends ApplicationFailure
![Page 22: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/22.jpg)
A message!case class User(id: UserReference, username: String, hashedPassword: String, activationCode: Option[String], email: EmailAddress, mobile: MobileNumber)
package object domain { type UserReference = UUID}
![Page 23: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/23.jpg)
A message!class UserService(implicit val actorSystem: ActorSystem) extends Directives with UserServiceMarshallers with DefaultTimeout {
def userRegistrationActor = actorSystem.actorFor("/user/application/registration")
val route = path("users") { post { handleWith { ru: RegisterUser => (userRegistrationActor ? ru).mapTo[ Either[ApplicationFailure, RegisteredUser]] } } }
}
![Page 24: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/24.jpg)
RegisterUser
ApplicationFailure RegisteredUser
![Page 25: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/25.jpg)
RegisterUser
ApplicationFailure RegisteredUser
![Page 26: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/26.jpg)
Hierarchies
http://en.wikipedia.org/wiki/Class_sketch
![Page 27: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/27.jpg)
The user actor structure• UserActor creates and supervises the
• MessageDeliveryActor, which sends e-mails and text messages
• UserRegistrationActor, which takes care of the registration (and sends the activation code using the MessageDeliveryActor)
• UserManagementActor, which provides the boring “management” operations
![Page 28: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/28.jpg)
The user actor structureclass UserActor extends Actor { val messageDelivery = context.actorOf(Props[MessageDeliveryActor]) val registration = context.actorOf( Props(new UserRegistrationActor(messageDelivery)), "registration") val management = context.actorOf( Props(new UserManagementActor(messageDelivery)), "management") ...}
class MessageDeliveryActor extends Actor class UserRegistrationActor(md: ActorRef) extends Actor class UserManagementActor(md: ActorRef) extends Actor
![Page 29: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/29.jpg)
The user actor structureclass UserRegistrationActor(messageDelivery: ActorRef) extends Actor {
def receive = { case RegisterUser(username, password, email, mobile) => val user = ... // prepare the User instance messageDelivery ! DeliverActivationCode( mobile, user.activationCode.get) sender ! Right(RegisteredUser(user)) }}
![Page 30: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/30.jpg)
The user actor structureclass MessageDeliveryActor extends Actor {
def receive = { case DeliverActivationCode(MobileNumber(number), code) => deliverTextMessage(number, "Your code is " + code) }}
![Page 31: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/31.jpg)
The user actor structureclass MessageDeliveryActor extends Actor { this: TextMessageDelivery =>
def receive = { case DeliverActivationCode(MobileNumber(number), code) => deliverTextMessage(number, "Your code is " + code) }}
![Page 32: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/32.jpg)
The user actor structureclass MessageDeliveryActor extends Actor { this: TextMessageDelivery =>
def receive = { case DeliverActivationCode(MobileNumber(number), code) => deliverTextMessage(number, "Your code is " + code) }}trait TextMessageDelivery { def deliverTextMessage(number: String, message: String)}
![Page 33: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/33.jpg)
The user actor structureclass MessageDeliveryActor extends Actor { this: TextMessageDelivery =>
def receive = { case DeliverActivationCode(MobileNumber(number), code) => deliverTextMessage(number, "Your code is " + code) }}trait TextMessageDelivery { def deliverTextMessage(number: String, message: String)}trait NexmoTextMessageDelivery extends TextMessageDelivery { this: HttpIO => private lazy val pipeline = HttpConduit.sendReceive(makeConduit("rest.nexmo.com"))
def deliverTextMessage(number: String, message: String) { val request = HttpRequest(POST, "https://...") pipeline(request) onSuccess { ... } }}
![Page 34: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/34.jpg)
The user actor structureclass UserActor extends Actor { val messageDelivery = context.actorOf(Props[MessageDeliveryActor])
val registration = context.actorOf( Props(new UserRegistrationActor(messageDelivery)), "registration") val management = context.actorOf( Props(new UserManagementActor(messageDelivery)), "management") ...}
![Page 35: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/35.jpg)
The user actor structureclass UserActor extends Actor { val messageDelivery = context.actorOf(Props( new MessageDeliveryActor with MexmoTextMessageDelivery with ActorHttpIO)) val registration = context.actorOf( Props(new UserRegistrationActor(messageDelivery)), "registration") val management = context.actorOf( Props(new UserManagementActor(messageDelivery)), "management") ...}
![Page 36: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/36.jpg)
Testing
![Page 37: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/37.jpg)
Observe the messagesclass UserRegistrationActorSpec extends TestKit(ActorSystem()) with Specification with ImplicitSender {
val actor = TestActorRef( new UserRegistrationActor(testActor))
"register the user and send the code" in { actor ! RegisterUser("janm", "*********", ...) val code = expectMsgType[DeliverActivationCode] val user = expectMsgType[Either[ ApplicationFailure, RegisteredUser]] user.activationCode mustEqual Some(code) }}case RegisterUser(username, password, email, mobile) => val user = ... // prepare the User instance messageDelivery ! DeliverActivationCode( mobile, user.activationCode.get) sender ! Right(RegisteredUser(user))
![Page 38: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/38.jpg)
Observe the messagesclass UserRegistrationActorIntegrationSpec extends TestKit(ActorSystem()) with Specification with ImplicitSender with CoreSystem {
val actor = system.actorFor( "/user/application/user/registration")
"register the user and send the code" in { actor ! RegisterUser("janm", "*********", ...)
val user = expectMsgType[Either[ ApplicationFailure, RegisteredUser]] ... }}
![Page 39: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/39.jpg)
Observe the messagesclass UserServiceSpec extends TestKit(ActorSystem()) with TestKitRouteTest with Specification with ImplicitSender with CoreSystem with Api {
"register the user and send the code" in { val username = "janm" Post(login, RegisterUser(username, "****", ...)) ~> routes ~> check { val resp = entityAs[RegisteredUser] resp.user.username mustEqual username } }}
case class RegisteredUser(user: User)
![Page 40: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/40.jpg)
Scala, Akka, Spray, ...• Akka brings asynchronous & non–blocking
behaviour (!, ?) and ability to dynamically change the structure of your application at runtime
• Spray wraps it in REST API
• Specs2 simplifies very expressive tests
• Scala gives type safety and expressiveness, functions as first-class citizens (directives in the route), very flexible way to “inject” dependencies
![Page 41: Making most of Scala - Trifork · 2012-12-17 · Making most of Scala Akka, Scala, Spray, Specs2; all in 50 minutes! Jan Machacek •Chief whip at Cake Solutions •Author of Pro](https://reader036.fdocuments.in/reader036/viewer/2022081507/5ee1c30fad6a402d666c868f/html5/thumbnails/41.jpg)