Skip to content

Commit 727beb0

Browse files
author
Reinier Lamers
committed
separate loading text as script into a separate library
1 parent 1106e9e commit 727beb0

File tree

6 files changed

+125
-114
lines changed

6 files changed

+125
-114
lines changed

aws-lambda/src/main/scala/chargepoint/docile/Lambda.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package chargepoint.docile
22

33
import java.net.URI
44

5-
import chargepoint.docile.test.{ResultSummary, RunOnce, Runner, RunnerConfig}
5+
import chargepoint.docile.test.{Loader, ResultSummary, RunOnce, Runner, RunnerConfig}
66
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain
77
import com.amazonaws.services.lambda.runtime.Context
88
import com.amazonaws.services.lambda.runtime.events.S3Event
@@ -62,7 +62,7 @@ object Lambda extends App {
6262
)
6363

6464
println(s"executing ${script.name} as $cpId on $cpUri")
65-
val runner: Runner[V1X.type] = Runner.forBytes(V1X, script.name, script.content)
65+
val runner: Runner[V1X.type] = Loader.runnerFor(V1X, script.name, script.content)
6666

6767
Try(runner.run(runnerCfg)) match {
6868
case Success(testsPassed) =>

build.sbt

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
2-
scalacOptions ++= Seq("-Xlint:-nullary-unit")
3-
4-
enablePlugins(OssLibPlugin)
5-
61
lazy val commonSettings = Seq(
72
organization := "com.newmotion",
83
scalaVersion := "2.12.8",
94
crossScalaVersions := Seq(tnm.ScalaVersion.aged, "2.12.8"),
5+
scalacOptions ++= Seq("-Xlint:-nullary-unit"),
106
javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-Xlint")
117
)
128

139
lazy val commandLine = (project in file("cmd"))
1410
.dependsOn(core)
1511
.dependsOn(loader)
12+
.enablePlugins(OssLibPlugin)
1613
.settings(
1714
commonSettings,
1815
name := "docile-charge-point-command-line",
@@ -22,45 +19,46 @@ lazy val commandLine = (project in file("cmd"))
2219
connectInput in run := true
2320
)
2421

25-
lazy val core = (project in file("core")).
26-
settings(
22+
lazy val core = (project in file("core"))
23+
.enablePlugins(OssLibPlugin)
24+
.settings(
2725
commonSettings,
2826
name := "docile-charge-point",
29-
libraryDependencies ++= coreDeps(scalaVersion.value)
27+
libraryDependencies ++= coreDeps
3028
)
3129

3230
lazy val loader = (project in file("loader"))
3331
.dependsOn(core)
32+
.enablePlugins(OssLibPlugin)
3433
.settings(
3534
commonSettings,
35+
libraryDependencies ++= loaderDeps(scalaVersion.value),
3636
name := "docile-charge-point-loader"
3737
)
3838

3939
lazy val lambda = (project in file("aws-lambda"))
4040
.dependsOn(core)
4141
.dependsOn(loader)
42-
.settings(
42+
.enablePlugins(OssLibPlugin) .settings(
4343
commonSettings,
44-
name := "lambda-docile-charge-point",
44+
name := "docile-charge-point-lambda",
4545
retrieveManaged := true,
4646
libraryDependencies ++= awsDeps,
4747
mainClass := Some("chargepoint.docile.Lambda"),
4848
assemblyJarName in assembly := "docile-lambda.jar"
4949
)
5050

51-
assemblyJarName in assembly := "docile.jar"
52-
53-
connectInput in run := true
54-
55-
def coreDeps(scalaVersion: String) = Seq(
51+
lazy val coreDeps = Seq(
5652
"com.thenewmotion.ocpp" %% "ocpp-j-api" % "9.1.0",
57-
"org.scala-lang" % "scala-compiler" % scalaVersion,
58-
"org.slf4j" % "slf4j-api" % "1.7.25",
5953
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.0",
6054

6155
"org.specs2" %% "specs2-core" % "4.3.4" % "test"
6256
)
6357

58+
def loaderDeps(scalaVersion: String) = Seq(
59+
"org.scala-lang" % "scala-compiler" % scalaVersion,
60+
)
61+
6462
lazy val commandLineDeps = Seq(
6563
"com.lihaoyi" % "ammonite" % "1.6.5" cross CrossVersion.full,
6664
"org.rogach" %% "scallop" % "3.1.3",
File renamed without changes.

cmd/src/main/scala/chargepoint/docile/Main.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import chargepoint.docile.test._
77
import ResultSummary.summarizeResults
88
import ch.qos.logback.classic.{Level, Logger}
99
import com.thenewmotion.ocpp.{Version, VersionFamily}
10-
import com.typesafe.scalalogging.{StrictLogging}
10+
import com.typesafe.scalalogging.StrictLogging
1111
import javax.net.ssl.SSLContext
1212
import org.rogach.scallop._
1313
import org.slf4j.LoggerFactory
@@ -179,7 +179,7 @@ object Main extends App with StrictLogging {
179179
if (conf.interactive())
180180
interactiveRunner(conf.version().family)
181181
else
182-
Runner.forFiles(conf.version().family, conf.files())
182+
Loader.runnerFor(conf.version().family, conf.files())
183183

184184
Try(runner.run(runnerCfg)) match {
185185
case Success(testsPassed) =>

core/src/main/scala/chargepoint/docile/test/Runner.scala

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package chargepoint.docile
22
package test
33

4-
import java.io.File
54
import java.net.URI
6-
import java.nio.charset.StandardCharsets
75

8-
import scala.tools.reflect.ToolBox
96
import scala.util.{Failure, Success, Try}
107
import scala.collection.mutable
118
import scala.concurrent.{Await, Future, Promise, duration}
@@ -14,7 +11,6 @@ import scala.concurrent.ExecutionContext.Implicits.global
1411
import chargepoint.docile.dsl._
1512
import com.thenewmotion.ocpp
1613
import com.thenewmotion.ocpp.VersionFamily
17-
import com.thenewmotion.ocpp.VersionFamily.{V1X, V20}
1814
import com.typesafe.scalalogging.Logger
1915
import javax.net.ssl.SSLContext
2016
import org.slf4j.LoggerFactory
@@ -152,92 +148,3 @@ class Runner[VFam <: VersionFamily](testCases: Seq[TestCase[VFam]]) {
152148
}
153149

154150

155-
object Runner {
156-
157-
private val logger = LoggerFactory.getLogger("runner")
158-
159-
def forFiles(vfam: VersionFamily, files: Seq[String]): Runner[vfam.type] =
160-
new Runner(files.map(loadFile(vfam, _)))
161-
162-
private def loadFile(vfam: VersionFamily, f: String): TestCase[vfam.type] = {
163-
val file = new File(f)
164-
val testNameRegex = "(?:.*/)?([^/]+?)(?:\\.[^.]*)?$".r
165-
val testName = f match {
166-
case testNameRegex(n) => n
167-
case _ => f
168-
}
169-
val fileContents = scala.io.Source.fromFile(file).getLines.mkString("\n")
170-
171-
loadString(vfam, testName, fileContents)
172-
}
173-
174-
def forBytes(vfam: VersionFamily, name:String, bytes:Array[Byte]): Runner[vfam.type] =
175-
new Runner(Seq(loadString(vfam, name, new String(bytes, StandardCharsets.UTF_8))))
176-
177-
178-
private def loadString(vfam: VersionFamily, name:String, txt: String): TestCase[vfam.type] = {
179-
import reflect.runtime.currentMirror
180-
val toolbox = currentMirror.mkToolBox()
181-
182-
val appendix = ";\n }\n}"
183-
184-
logger.info(s"Parsing and compiling script '$name'")
185-
186-
val preamble = preambleForVersionFamily(vfam)
187-
188-
val fileAst = toolbox.parse(preamble + txt + appendix)
189-
190-
logger.info(s"Parsed '$name'")
191-
192-
val compiledCode = toolbox.compile(fileAst)
193-
194-
logger.info(s"Compiled '$name'")
195-
196-
TestCase(name, () => compiledCode().asInstanceOf[OcppTest[vfam.type]])
197-
}
198-
199-
private def preambleForVersionFamily(vfam: VersionFamily): String = {
200-
val (messagesPackage, instantiatedType, csmsMessagesWitness, csMessagesWitness) = vfam match {
201-
case V1X => (
202-
"v1x",
203-
"chargepoint.docile.dsl.Ocpp1XTest with chargepoint.docile.dsl.Ocpp1XTest.V1XOps",
204-
"com.thenewmotion.ocpp.VersionFamily.V1XCentralSystemMessages",
205-
"com.thenewmotion.ocpp.VersionFamily.V1XChargePointMessages"
206-
)
207-
case V20 => (
208-
"v20",
209-
"chargepoint.docile.dsl.Ocpp20Test with chargepoint.docile.dsl.Ocpp20Test.V20Ops",
210-
"com.thenewmotion.ocpp.VersionFamily.V20CsmsMessages",
211-
"com.thenewmotion.ocpp.VersionFamily.V20CsMessages"
212-
)
213-
}
214-
215-
s"""
216-
|import com.thenewmotion.ocpp.messages.$messagesPackage._
217-
|
218-
|import scala.language.postfixOps
219-
|import scala.concurrent.duration._
220-
|import scala.concurrent.ExecutionContext
221-
|import scala.util.Random
222-
|import java.time._
223-
|import com.typesafe.scalalogging.Logger
224-
|import org.slf4j.LoggerFactory
225-
|
226-
|import chargepoint.docile.dsl.AwaitTimeout
227-
|import chargepoint.docile.dsl.Randomized._
228-
|
229-
|new $instantiatedType {
230-
|
231-
| implicit val executionContext: ExecutionContext = ExecutionContext.global
232-
| implicit val csmsMessageTypes = $csmsMessagesWitness
233-
| implicit val csMessageTypes = $csMessagesWitness
234-
|
235-
| private implicit val rand: Random = new Random()
236-
|
237-
| def run(defaultAwaitTimeout: AwaitTimeout) {
238-
| implicit val awaitTimeout: AwaitTimeout = defaultAwaitTimeout;
239-
|
240-
""".stripMargin
241-
}
242-
}
243-
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package chargepoint.docile.test
2+
3+
import java.io.File
4+
import java.nio.charset.StandardCharsets
5+
6+
import scala.tools.reflect.ToolBox
7+
8+
import chargepoint.docile.dsl.OcppTest
9+
import com.thenewmotion.ocpp.VersionFamily
10+
import com.thenewmotion.ocpp.VersionFamily.{V1X, V20}
11+
import org.slf4j.LoggerFactory
12+
13+
object Loader {
14+
15+
private val logger = LoggerFactory.getLogger("loader")
16+
17+
def runnerFor(vfam: VersionFamily, filenames: Seq[String]): Runner[vfam.type] =
18+
new Runner(filenames.map(loadFile(vfam, _)))
19+
20+
private def loadFile(vfam: VersionFamily, f: String): TestCase[vfam.type] = {
21+
val file = new File(f)
22+
val testNameRegex = "(?:.*/)?([^/]+?)(?:\\.[^.]*)?$".r
23+
val testName = f match {
24+
case testNameRegex(n) => n
25+
case _ => f
26+
}
27+
val fileSource = scala.io.Source.fromFile(file)
28+
var fileContents = ""
29+
try {
30+
fileContents = fileSource.getLines.mkString("\n")
31+
} finally {
32+
fileSource.close()
33+
}
34+
35+
runnerFor(vfam, testName, fileContents)
36+
}
37+
38+
def runnerFor(vfam: VersionFamily, name:String, fileContent: Array[Byte]): Runner[vfam.type] =
39+
new Runner(Seq(runnerFor(vfam, name, new String(fileContent, StandardCharsets.UTF_8))))
40+
41+
42+
def runnerFor(vfam: VersionFamily, name:String, fileContent: String): TestCase[vfam.type] = {
43+
import reflect.runtime.currentMirror
44+
val toolbox = currentMirror.mkToolBox()
45+
46+
val appendix = ";\n }\n}"
47+
48+
logger.info(s"Parsing and compiling script '$name'")
49+
50+
val preamble = preambleForVersionFamily(vfam)
51+
52+
val fileAst = toolbox.parse(preamble + fileContent + appendix)
53+
54+
logger.info(s"Parsed '$name'")
55+
56+
val compiledCode = toolbox.compile(fileAst)
57+
58+
logger.info(s"Compiled '$name'")
59+
60+
TestCase(name, () => compiledCode().asInstanceOf[OcppTest[vfam.type]])
61+
}
62+
63+
private def preambleForVersionFamily(vfam: VersionFamily): String = {
64+
val (messagesPackage, instantiatedType, csmsMessagesWitness, csMessagesWitness) = vfam match {
65+
case V1X => (
66+
"v1x",
67+
"chargepoint.docile.dsl.Ocpp1XTest with chargepoint.docile.dsl.Ocpp1XTest.V1XOps",
68+
"com.thenewmotion.ocpp.VersionFamily.V1XCentralSystemMessages",
69+
"com.thenewmotion.ocpp.VersionFamily.V1XChargePointMessages"
70+
)
71+
case V20 => (
72+
"v20",
73+
"chargepoint.docile.dsl.Ocpp20Test with chargepoint.docile.dsl.Ocpp20Test.V20Ops",
74+
"com.thenewmotion.ocpp.VersionFamily.V20CsmsMessages",
75+
"com.thenewmotion.ocpp.VersionFamily.V20CsMessages"
76+
)
77+
}
78+
79+
s"""
80+
|import com.thenewmotion.ocpp.messages.$messagesPackage._
81+
|
82+
|import scala.language.postfixOps
83+
|import scala.concurrent.duration._
84+
|import scala.concurrent.ExecutionContext
85+
|import scala.util.Random
86+
|import java.time._
87+
|import com.typesafe.scalalogging.Logger
88+
|import org.slf4j.LoggerFactory
89+
|
90+
|import chargepoint.docile.dsl.AwaitTimeout
91+
|import chargepoint.docile.dsl.Randomized._
92+
|
93+
|new $instantiatedType {
94+
|
95+
| implicit val executionContext: ExecutionContext = ExecutionContext.global
96+
| implicit val csmsMessageTypes = $csmsMessagesWitness
97+
| implicit val csMessageTypes = $csMessagesWitness
98+
|
99+
| private implicit val rand: Random = new Random()
100+
|
101+
| def run(defaultAwaitTimeout: AwaitTimeout) {
102+
| implicit val awaitTimeout: AwaitTimeout = defaultAwaitTimeout;
103+
|
104+
""".stripMargin
105+
}
106+
}

0 commit comments

Comments
 (0)