Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support to Play 2.6.1 and Scala 2.12.2 #7

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ It will only store one version of a file since it computes the sha1 hash of the
// in you're build.sbt file

val appDependencies = Seq(
"se.digiplant" %% "play-res" % "1.2.0"
"se.digiplant" %% "play-res" % "1.3.0"
)

// To simplify the reverse routing we can import the digiPlant namespace
Expand Down
3 changes: 3 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# 1.3.0
* Play 2.6 support

# 1.2.0
* Play 2.5 support

Expand Down
12 changes: 8 additions & 4 deletions app/se/digiplant/res/ResAssets.scala
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package se.digiplant.res

import javax.inject.{Singleton, Inject}
import javax.inject.{Inject, Singleton}

import play.api._
import play.api.mvc._
import play.api.libs._
import org.joda.time.format.{DateTimeFormatter, DateTimeFormat}
import org.joda.time.format.{DateTimeFormat, DateTimeFormatter}
import org.joda.time.DateTimeZone

import collection.JavaConverters._
import java.io.File

import scala.concurrent.ExecutionContext

@Singleton
class ResAssets @Inject()(environment: Environment, res: api.Res) extends Controller {
class ResAssets @Inject()(components: ControllerComponents, environment: Environment, res: api.Res)
(implicit ec: ExecutionContext) extends AbstractController(components) {

private val timeZoneCode = "GMT"

Expand All @@ -29,7 +33,7 @@ class ResAssets @Inject()(environment: Environment, res: api.Res) extends Contro

private val parsableTimezoneCode = " " + timeZoneCode

def at(file: String, source: String = "default"): Action[AnyContent] = Action { request =>
def at(file: String, source: String = "default"): Action[AnyContent] = Action { request: RequestHeader =>

def parseDate(date: String): Option[java.util.Date] = {
try {
Expand Down
18 changes: 10 additions & 8 deletions app/se/digiplant/res/api/Res.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package se.digiplant.res.api
import javax.inject.{Singleton, Inject}

import play.api._
import libs.{Files, MimeTypes}
import libs.Files
import java.io.{FileInputStream, File}
import org.apache.commons.io.{FilenameUtils, FileUtils}

import org.apache.commons.io.{FileUtils, FilenameUtils}
import org.apache.commons.codec.digest.DigestUtils
import play.api.http.FileMimeTypes

trait Res {

Expand Down Expand Up @@ -82,13 +84,13 @@ trait Res {
}

@Singleton
class ResImpl @Inject()(environment: Environment, configuration: Configuration) extends Res {
class ResImpl @Inject()(environment: Environment, configuration: Configuration, mimeTypes: FileMimeTypes) extends Res {

lazy val config = configuration.getConfig("res").getOrElse(Configuration.empty)
lazy val config: Configuration = configuration.getOptional[Configuration]("res").getOrElse(Configuration.empty)

lazy val sources: Map[String, File] = config.subKeys.map {
sourceKey =>
val path = config.getString(sourceKey).getOrElse(throw config.reportError("res." + sourceKey, "Missing res path[" + sourceKey + "]"))
val path = config.getOptional[String](sourceKey).getOrElse(throw config.reportError("res." + sourceKey, "Missing res path[" + sourceKey + "]"))
val file = new File(FilenameUtils.concat(environment.rootPath.getAbsolutePath, path))
if (file.isDirectory && !file.exists()) {
FileUtils.forceMkdir(file)
Expand Down Expand Up @@ -143,7 +145,7 @@ class ResImpl @Inject()(environment: Environment, configuration: Configuration)

require(name.length > 12, "name must contain atleast 12 chars to be able to be stored properly.")

val dir = sources.get(source).get
val dir = sources(source)

val base = new File(dir, hashAsDirectories(name))
if (!base.exists()) {
Expand Down Expand Up @@ -190,7 +192,7 @@ class ResImpl @Inject()(environment: Environment, configuration: Configuration)
getExtensionFromMimeType(filePart.contentType)
)
val ext = extensionOptions.collectFirst { case Some(x) => x }
put(filePart.ref.file, source, None, ext, meta)
put(filePart.ref, source, None, ext, meta)
}

/**
Expand Down Expand Up @@ -257,6 +259,6 @@ class ResImpl @Inject()(environment: Environment, configuration: Configuration)
case Some("image/jpeg") => Some("jpg")
case Some("image/png") => Some("png")
case Some("image/gif") => Some("gif")
case Some(m) => MimeTypes.types.map(_.swap).get(m)
case Some(m) => mimeTypes.forFileName(m)
}
}
6 changes: 3 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name := "play-res"

version := "1.2.0"

scalaVersion := "2.11.7"
scalaVersion := "2.12.2"

organization := "se.digiplant"

Expand All @@ -11,8 +11,8 @@ scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature")
resolvers += Resolver.sonatypeRepo("releases")

libraryDependencies ++= Seq(
"commons-io" % "commons-io" % "2.4",
"commons-codec" % "commons-codec" % "1.6",
"commons-io" % "commons-io" % "2.5",
"commons-codec" % "commons-codec" % "1.10",
specs2 % Test,
"com.typesafe.play" %% "play" % play.core.PlayVersion.current % "provided",
"com.typesafe.play" %% "play-test" % play.core.PlayVersion.current % "test"
Expand Down
2 changes: 1 addition & 1 deletion project/Plugins.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ resolvers ++= Seq(
Resolver.sonatypeRepo("releases")
)

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.1")
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.1")

addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")

Expand Down
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=0.13.11
sbt.version=0.13.15
4 changes: 2 additions & 2 deletions test/se/digiplant/res/ResAssetsSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ object ResAssetsSpec extends Specification {
val result = resAssets.at("5564ac5e3968e77b4022f55a23d36630bdeb0274.jpg")(FakeRequest())

status(result) must equalTo(OK)
contentType(result) must beSome("image/jpeg")
contentType(result) must beSome("application/octet-stream")
}

"return resource in supplied source" in new ResContext {
Expand All @@ -23,7 +23,7 @@ object ResAssetsSpec extends Specification {
val result = resAssets.at("5564ac5e3968e77b4022f55a23d36630bdeb0274.jpg", "images")(FakeRequest())

status(result) must equalTo(OK)
contentType(result) must beSome("image/jpeg")
contentType(result) must beSome("application/octet-stream")
}
}
}
14 changes: 10 additions & 4 deletions test/se/digiplant/res/Spec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,18 @@ import org.specs2.mock.Mockito
import org.specs2.specification._
import org.specs2.mutable.Around
import org.specs2.execute.AsResult
import play.api.{Environment, Application, Configuration}
import play.api.{Application, Configuration, Environment}
import play.api.inject.guice.GuiceApplicationBuilder
import play.api.test._
import java.io.File

import org.apache.commons.io.FileUtils
import play.api.http.FileMimeTypes

import scala.concurrent.ExecutionContext
import util.Random

trait ResContext extends Around with TempFile with Mockito with MustThrownExpectations {
trait ResContext extends Around with TempFile with Mockito with MustThrownExpectations with Injecting {

val environment = Environment.simple()
val configuration = Configuration("res.default" -> "tmp/default", "res.images" -> "tmp/images")
Expand All @@ -22,8 +26,10 @@ trait ResContext extends Around with TempFile with Mockito with MustThrownExpect
.in(environment)
.build

val res = new api.ResImpl(environment, configuration)
val resAssets = new ResAssets(mock[Environment], res)
implicit val executionContext = inject[ExecutionContext]

val res = new api.ResImpl(environment, configuration, mock[FileMimeTypes])
val resAssets = new ResAssets(Helpers.stubControllerComponents(), mock[Environment], res)

def around[T : AsResult](t: =>T) = Helpers.running(app) {
val result = AsResult.effectively(t)
Expand Down
9 changes: 5 additions & 4 deletions test/se/digiplant/res/api/ResSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package se.digiplant.res.api

import se.digiplant.res.ResContext
import org.specs2.mutable.Specification
import java.io.{FileInputStream, File}
import java.io.{File, FileInputStream}

import org.apache.commons.io.IOUtils
import play.api._
import libs.Files.TemporaryFile
import libs.Files.SingletonTemporaryFileCreator
import play.api.mvc.MultipartFormData.FilePart

object ResSpec extends Specification {
Expand Down Expand Up @@ -33,13 +34,13 @@ object ResSpec extends Specification {
}

"put a scala filepart" in new ResContext {
val f = FilePart("testPart", "filename", Some("image/jpeg"), TemporaryFile(testFile))
val f = FilePart("testPart", "filename", Some("image/jpeg"), SingletonTemporaryFileCreator.create(testFile.toPath))
val fileuid = res.put(f, "default", Seq.empty)
fileuid must not beEmpty
}

"put a scala filepart with no extension" in new ResContext {
val f = FilePart("testPart", "filename", Some("image/jpeg"), TemporaryFile(anonymousTestFile))
val f = FilePart("testPart", "filename", Some("image/jpeg"), SingletonTemporaryFileCreator.create(anonymousTestFile.toPath))
val fileuid = res.put(f, "default", Seq.empty)
fileuid must not beEmpty
}
Expand Down