Skip to content

Commit f28594e

Browse files
committed
prepare for release 1.0.0
1 parent 70a2be8 commit f28594e

File tree

5 files changed

+157
-55
lines changed

5 files changed

+157
-55
lines changed

build.sbt

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,57 @@ resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/"
22

33
name := """codacy-engine-scala-seed"""
44

5-
version := "1.0-SNAPSHOT"
5+
version := "1.0.0"
6+
7+
scalaVersion := "2.10.5"
8+
9+
crossScalaVersions := Seq("2.10.5", "2.11.7")
10+
11+
scalacOptions := Seq("-deprecation", "-feature", "-unchecked", "-Ywarn-adapted-args", "-Xlint", "-Xfatal-warnings")
12+
13+
organization := "com.codacy"
14+
15+
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.3.8"
616

717
organization := "com.codacy"
818

9-
scalaVersion := "2.11.7"
19+
organizationName := "Codacy"
20+
21+
organizationHomepage := Some(new URL("https://www.codacy.com"))
22+
23+
publishMavenStyle := true
24+
25+
publishArtifact in Test := false
26+
27+
pomIncludeRepository := { _ => false}
28+
29+
publishTo := {
30+
val nexus = "https://oss.sonatype.org/"
31+
if (version.value.trim.endsWith("SNAPSHOT"))
32+
Some("snapshots" at nexus + "content/repositories/snapshots")
33+
else
34+
Some("releases" at nexus + "service/local/staging/deploy/maven2")
35+
}
36+
37+
startYear := Some(2015)
38+
39+
description := "Library to develop Codacy tool plugins"
40+
41+
licenses := Seq("The Apache Software License, Version 2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0.txt"))
42+
43+
homepage := Some(url("http://www.github.com/codacy/codacy-engine-scala-seed/"))
1044

11-
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.3.8"
45+
pomExtra :=
46+
<scm>
47+
<url>http://www.github.com/codacy/codacy-engine-scala-seed</url>
48+
<connection>scm:git:git@github.com:codacy/codacy-engine-scala-seed.git</connection>
49+
<developerConnection>scm:git:https://github.com/codacy/codacy-engine-scala-seed.git</developerConnection>
50+
</scm>
51+
<developers>
52+
<developer>
53+
<id>johannegger</id>
54+
<name>Johann</name>
55+
<email>johann [at] codacy.com</email>
56+
<url>https://github.com/johannegger</url>
57+
</developer>
58+
</developers>

project/plugins.sbt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import sbt._
2+
3+
resolvers ++= Seq(
4+
DefaultMavenRepository,
5+
"Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/",
6+
"Sonatype snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/",
7+
Classpaths.typesafeReleases,
8+
Classpaths.sbtPluginReleases
9+
)
10+
11+
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "0.5.1")
12+
13+
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")
14+
15+
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.9")

src/main/scala/codacy/dockerApi/DockerEngine.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package codacy.dockerApi
22

3+
import codacy.dockerApi.DockerEnvironment._
34
import play.api.libs.json.Json
45

56
import scala.util.{Failure, Success}
6-
import DockerEnvironment._
77

88
abstract class DockerEngine(Tool: Tool) {
99

@@ -13,7 +13,7 @@ abstract class DockerEngine(Tool: Tool) {
1313
//search for our config
1414
val maybePatterns = maybeConfig.flatMap(_.tools.collectFirst { case config if config.name == spec.name =>
1515
val allPatternIds = spec.patterns.map(_.patternId)
16-
config.patterns.filter{ case pattern => allPatternIds.contains(pattern.patternId) }
16+
config.patterns.filter { case pattern => allPatternIds.contains(pattern.patternId) }
1717
})
1818
val maybeFiles = maybeConfig.flatMap(_.files.map(_.map { case path =>
1919
sourcePath.resolve(path.value)
@@ -27,7 +27,7 @@ abstract class DockerEngine(Tool: Tool) {
2727
}
2828
} match {
2929
case Success(results) =>
30-
results.map{ case result =>
30+
results.map { case result =>
3131
println(Json.stringify(Json.toJson(result)))
3232
}.toList
3333

src/main/scala/codacy/dockerApi/DockerEnvironment.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package codacy.dockerApi
22

33
import java.nio.file.{Files, Paths}
4+
45
import play.api.data.validation.ValidationError
56
import play.api.libs.json.{JsError, JsPath, Json}
67

src/main/scala/codacy/dockerApi/package.scala

Lines changed: 88 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,107 @@ import java.nio.file.Path
44

55
import play.api.libs.json._
66

7+
import scala.language.reflectiveCalls
78
import scala.util.Try
89

910
package dockerApi {
1011

11-
abstract class Formats[W <: AnyVal{ val value:B },B](apply_ : (B => W)) extends (B => W){ self =>
12+
abstract class Formats[W <: AnyVal {val value : B}, B](apply_ : (B => W)) extends (B => W) {
13+
self =>
1214

13-
implicit def writes(implicit writes: Writes[B]):Writes[W] = Writes(
14-
(_:W).value match{ case value:B@unchecked => writes.writes(value) }
15-
)
15+
implicit def writes(implicit writes: Writes[B]): Writes[W] = Writes(
16+
(_: W).value match { case value: B@unchecked => writes.writes(value) }
17+
)
1618

17-
implicit def reads(implicit reads: Reads[B]):Reads[W] = reads.map( self.apply )
19+
implicit def reads(implicit reads: Reads[B]): Reads[W] = reads.map(self.apply)
1820

19-
override def apply(v1: B): W = apply_(v1)
20-
}
21+
override def apply(v1: B): W = apply_(v1)
22+
}
23+
24+
trait Tool {
25+
def apply(path: Path, conf: Option[Seq[PatternDef]], files: Option[Set[Path]])(implicit spec: Spec): Try[Iterable[Result]]
26+
}
27+
28+
final class PatternId(val value: String) extends AnyVal {
29+
override def toString = value.toString
30+
}
31+
32+
final class SourcePath(val value: String) extends AnyVal {
33+
override def toString = value.toString
34+
}
35+
36+
final class ResultMessage(val value: String) extends AnyVal {
37+
override def toString = value.toString
38+
}
39+
40+
final class ResultLine(val value: Int) extends AnyVal {
41+
override def toString = value.toString
42+
}
43+
44+
final class ToolName(val value: String) extends AnyVal {
45+
override def toString = value.toString
46+
}
47+
48+
final class ErrorMessage(val value: String) extends AnyVal {
49+
override def toString = value.toString
50+
}
51+
52+
final class ParameterName(val value: String) extends AnyVal {
53+
override def toString = value.toString
54+
}
55+
56+
object PatternId extends Formats[PatternId, String](new PatternId(_))
57+
58+
object SourcePath extends Formats[SourcePath, String](new SourcePath(_))
59+
60+
object ResultMessage extends Formats[ResultMessage, String](new ResultMessage(_))
61+
62+
object ResultLine extends Formats[ResultLine, Int](new ResultLine(_))
63+
64+
object ToolName extends Formats[ToolName, String](new ToolName(_))
65+
66+
object ErrorMessage extends Formats[ErrorMessage, String](new ErrorMessage(_))
67+
68+
object ParameterName extends Formats[ParameterName, String](new ParameterName(_))
69+
70+
case class ParameterDef(name: ParameterName, value: JsValue)
71+
72+
case class PatternDef(patternId: PatternId, parameters: Option[Set[ParameterDef]])
73+
74+
case class ToolConfig(name: ToolName, patterns: Seq[PatternDef])
75+
76+
private[dockerApi] case class FullConfig(tools: Set[ToolConfig], files: Option[Set[SourcePath]])
77+
78+
//there are other fields like name and description but i don't care about them inside the tool
79+
case class ParameterSpec(name: ParameterName, default: JsValue)
80+
81+
case class PatternSpec(patternId: PatternId, parameters: Option[Set[ParameterSpec]])
82+
83+
case class Spec(name: ToolName, patterns: Set[PatternSpec])
84+
85+
sealed trait Result
86+
87+
final case class Issue(filename: SourcePath, message: ResultMessage, patternId: PatternId, line: ResultLine) extends Result
88+
89+
final case class FileError(filename: SourcePath, message: Option[ErrorMessage]) extends Result
2190

22-
trait Tool{ def apply(path: Path,conf: Option[Seq[PatternDef]], files:Option[Set[Path]])(implicit spec: Spec): Try[Iterable[Result]] }
23-
final class PatternId (val value:String) extends AnyVal{ override def toString = value.toString }
24-
final class SourcePath (val value:String) extends AnyVal{ override def toString = value.toString }
25-
final class ResultMessage (val value:String) extends AnyVal{ override def toString = value.toString }
26-
final class ResultLine (val value:Int ) extends AnyVal{ override def toString = value.toString }
27-
final class ToolName (val value:String) extends AnyVal{ override def toString = value.toString }
28-
final class ErrorMessage (val value:String) extends AnyVal{ override def toString = value.toString }
29-
final class ParameterName (val value:String) extends AnyVal{ override def toString = value.toString }
30-
31-
object PatternId extends Formats[PatternId , String]( new PatternId(_) )
32-
object SourcePath extends Formats[SourcePath , String]( new SourcePath(_) )
33-
object ResultMessage extends Formats[ResultMessage, String]( new ResultMessage(_) )
34-
object ResultLine extends Formats[ResultLine , Int ]( new ResultLine(_) )
35-
object ToolName extends Formats[ToolName , String]( new ToolName(_) )
36-
object ErrorMessage extends Formats[ErrorMessage , String]( new ErrorMessage(_) )
37-
object ParameterName extends Formats[ParameterName, String]( new ParameterName(_) )
38-
39-
case class ParameterDef(name:ParameterName,value:JsValue)
40-
case class PatternDef(patternId: PatternId, parameters:Option[Set[ParameterDef]])
41-
case class ToolConfig(name:ToolName, patterns:Seq[PatternDef])
42-
43-
private[dockerApi] case class FullConfig(tools:Set[ToolConfig],files:Option[Set[SourcePath]])
44-
//there are other fields like name and description but i don't care about them inside the tool
45-
case class ParameterSpec(name:ParameterName, default:JsValue)
46-
case class PatternSpec(patternId: PatternId, parameters:Option[Set[ParameterSpec]])
47-
48-
case class Spec(name:ToolName,patterns:Set[PatternSpec])
49-
50-
sealed trait Result
51-
final case class Issue(filename:SourcePath, message:ResultMessage, patternId:PatternId, line: ResultLine) extends Result
52-
final case class FileError(filename:SourcePath, message:Option[ErrorMessage]) extends Result
5391
}
5492

5593
package object dockerApi {
5694

57-
private[this] def asReader[A](jsResult: JsResult[A]): Reads[A] = Reads[A]((_:JsValue) => jsResult)
58-
implicit def toValue[A] = (a:AnyVal{ def value:A }) => a.value
95+
private[this] def asReader[A](jsResult: JsResult[A]): Reads[A] = Reads[A]((_: JsValue) => jsResult)
96+
97+
implicit def toValue[A] = (a: AnyVal {def value: A}) => a.value
5998

6099
implicit lazy val specReader: Reads[Spec] = {
61100
implicit val r1 = Json.reads[ParameterSpec]
62101
implicit val r0 = Json.reads[PatternSpec]
63102
Json.reads[Spec]
64103
}
65104

66-
implicit def configReader(implicit spec:Spec): Reads[FullConfig] = {
105+
implicit def configReader(implicit spec: Spec): Reads[FullConfig] = {
67106
implicit val r1 = Json.reads[ParameterDef]
68-
implicit val r0 = Json.reads[PatternDef]/*.flatMap{ case pattern =>
107+
implicit val r0 = Json.reads[PatternDef] /*.flatMap{ case pattern =>
69108
70109
val filtered =
71110
if (spec.patterns.exists(_.patternId == pattern.patternId)) JsSuccess(pattern)
@@ -76,7 +115,7 @@ package object dockerApi {
76115

77116
implicit val r2 = Reads.set(Json.reads[ToolConfig])
78117

79-
Json.reads[FullConfig]/*.flatMap{ case fullCfg =>
118+
Json.reads[FullConfig] /*.flatMap{ case fullCfg =>
80119
val ps = fullCfg.tools.collectFirst{ case tool if tool.name == spec.name =>
81120
if(tool.patterns.isEmpty) JsError("no patterns selected")
82121
else JsSuccess(fullCfg)
@@ -90,14 +129,14 @@ package object dockerApi {
90129
lazy val issueWrites = Json.writes[Issue]
91130
lazy val errorWrites = Json.writes[FileError]
92131

93-
Writes[Result]{ (result:Result) =>
94-
val base = result match{
95-
case issue:Issue => issueWrites.writes(issue)
96-
case error:FileError => errorWrites.writes(error)
132+
Writes[Result] { (result: Result) =>
133+
val base = result match {
134+
case issue: Issue => issueWrites.writes(issue)
135+
case error: FileError => errorWrites.writes(error)
97136
}
98137

99-
(base,result.getClass.getTypeName.split('.').lastOption) match{
100-
case (o:JsObject,Some(tpe)) => o ++ Json.obj("type" -> tpe )
138+
(base, result.getClass.getTypeName.split('.').lastOption) match {
139+
case (o: JsObject, Some(tpe)) => o ++ Json.obj("type" -> tpe)
101140
case other => base
102141
}
103142
}

0 commit comments

Comments
 (0)