Skip to content
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
58 changes: 58 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
lazy val core =
project
.settings(
name := "scala-core",
libraryDependencies ++= Seq(
"com.ning" % "async-http-client" % "1.9.40",
"org.json4s" %% "json4s-native" % "3.5.3",
"org.json4s" %% "json4s-ext" % "3.5.3",
"org.scalatest" %% "scalatest" % "3.0.4" % "test",
"org.nanohttpd" % "nanohttpd" % "2.2.0" % "test"
),

// http://mvnrepository.com/artifact/org.slf4j/slf4j-simple
libraryDependencies += "org.slf4j" % "slf4j-simple" % "1.7.21" % "test",
libraryDependencies += "org.scalamock" %% "scalamock-scalatest-support" % "3.6.0" % "test",
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature")
)

lazy val playPlugin =
project
.in(file("play-plugin"))
.enablePlugins(PlayScala)
.dependsOn(core)
.settings(
name := "scala-play-plugin",
libraryDependencies += "com.google.inject" % "guice" % "4.1.0"
)

lazy val sample =
project
.in(file("samples/photo_album"))
.settings(
publishArtifact := false,
libraryDependencies ++= Seq(
"com.h2database" % "h2" % "1.4.188",
"com.typesafe.play" %% "play-slick" % "3.0.3",
"com.typesafe.play" %% "play-slick-evolutions" % "3.0.3",
evolutions
),
includeFilter in (Assets, LessKeys.less) := "*.less",
excludeFilter in (Assets, LessKeys.less) := "_*.less",
routesGenerator := InjectedRoutesGenerator
)
.enablePlugins(PlayScala)
.dependsOn(playPlugin)

lazy val root =
project
.in(file("."))
.aggregate(
core,
playPlugin,
sample
)
.settings(
aggregate in update := false,
publishArtifact := false
)
50 changes: 0 additions & 50 deletions cloudinary-core/build.sbt

This file was deleted.

1 change: 0 additions & 1 deletion cloudinary-core/project/build.properties

This file was deleted.

1 change: 0 additions & 1 deletion cloudinary-core/project/plugins.sbt

This file was deleted.

38 changes: 0 additions & 38 deletions cloudinary-play-plugin/build.sbt

This file was deleted.

1 change: 0 additions & 1 deletion cloudinary-play-plugin/project/build.properties

This file was deleted.

8 changes: 0 additions & 8 deletions cloudinary-play-plugin/project/plugins.sbt

This file was deleted.

15 changes: 0 additions & 15 deletions cloudinary_scala_parent.sbt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,43 +1,40 @@
package com.cloudinary;

import java.security.SecureRandom
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.net.URI
import java.net.URLDecoder
import java.io.UnsupportedEncodingException
package com.cloudinary

import java.net.{ URI, URLDecoder }
import java.security.{ MessageDigest, NoSuchAlgorithmException, SecureRandom }

import _root_.com.ning.http.client.RequestBuilder

object Cloudinary {
final val CF_SHARED_CDN = "d3jpl91pxevbkh.cloudfront.net";
final val OLD_AKAMAI_SHARED_CDN = "cloudinary-a.akamaihd.net";
final val AKAMAI_SHARED_CDN = "res.cloudinary.com";
final val SHARED_CDN = AKAMAI_SHARED_CDN;
final val CF_SHARED_CDN = "d3jpl91pxevbkh.cloudfront.net"
final val OLD_AKAMAI_SHARED_CDN = "cloudinary-a.akamaihd.net"
final val AKAMAI_SHARED_CDN = "res.cloudinary.com"
final val SHARED_CDN = AKAMAI_SHARED_CDN
final val VERSION = "1.2.1"
final val USER_AGENT = s"cld-scala-$VERSION"

def configFromUrl(cloudinaryUrl: String): Map[String, Any] = {
val cloudinaryUri = new URI(cloudinaryUrl);
val creds = cloudinaryUri.getUserInfo().split(":")
val cloudinaryUri = new URI(cloudinaryUrl)
val creds = cloudinaryUri.getUserInfo.split(":")
val m = Map(
"cloud_name" -> cloudinaryUri.getHost,
"api_key" -> creds(0),
"api_secret" -> creds(1),
"private_cdn" -> cloudinaryUri.getPath(),
"secure_distribution" -> cloudinaryUri.getPath())
"private_cdn" -> cloudinaryUri.getPath,
"secure_distribution" -> cloudinaryUri.getPath)

if (cloudinaryUri.getQuery() != null) {
m ++ cloudinaryUri.getQuery().split("&").map {
if (cloudinaryUri.getQuery != null) {
m ++ cloudinaryUri.getQuery.split("&").map {
param: String =>
val kv = param.split("=")
(kv.head -> URLDecoder.decode(kv.last, "ASCII"))
kv.head -> URLDecoder.decode(kv.last, "ASCII")
}
} else m
}

private def bytes2Hex(bytes: Array[Byte]): String = bytes.map("%02X" format _).mkString

private final val RND = new SecureRandom();
private final val RND = new SecureRandom()

def signedPreloadedImage(result: Map[String, _]): String =
(for {
Expand All @@ -54,7 +51,7 @@ object Cloudinary {

val params = paramsToSign.toList.sortBy(_._1) collect {
case (k, v: Iterable[_]) => s"$k=${v.mkString(",")}"
case (k, v) if (v != null && v.toString() != "") => s"$k=$v"
case (k, v) if v != null && v.toString != "" => s"$k=$v"
}

val digest = sign(params.mkString("&"), apiSecret)
Expand All @@ -69,13 +66,13 @@ object Cloudinary {
case e: NoSuchAlgorithmException => throw new RuntimeException("Unexpected exception", e);
}

md.digest((toSign + apiSecret).getBytes());
md.digest((toSign + apiSecret).getBytes())
}

private[cloudinary] def randomPublicId() = {
val bytes = new Array[Byte](8);
RND.nextBytes(bytes);
bytes2Hex(bytes);
val bytes = new Array[Byte](8)
RND.nextBytes(bytes)
bytes2Hex(bytes)
}

private[cloudinary] def asString(value: Any, defaultValue: Option[String] = None): Option[String] =
Expand All @@ -86,7 +83,7 @@ object Cloudinary {
case Some(x) => asString(x, defaultValue)
case None => defaultValue
}
case _ => Some(value.toString())
case _ => Some(value.toString)
}

private[cloudinary] def asBoolean(value: Option[_]): Option[Boolean] = {
Expand Down Expand Up @@ -121,7 +118,7 @@ object Cloudinary {
class Cloudinary(config: Map[String, Any]) {

def this(cloudinaryUrl: String) {
this(Cloudinary.configFromUrl(cloudinaryUrl));
this(Cloudinary.configFromUrl(cloudinaryUrl))
}

def this() {
Expand All @@ -141,7 +138,7 @@ class Cloudinary(config: Map[String, Any]) {

def api() = new Api()

def search() = new Search()
def search() = Search()

def cloudinaryApiUrlPrefix(): String = {
val cloudinary = Cloudinary.asString(config.get("upload_prefix"),
Expand Down Expand Up @@ -187,22 +184,22 @@ class Cloudinary(config: Map[String, Any]) {
"format" -> format,
"attachment" -> attachment,
"type" -> `type`,
"timestamp" -> (System.currentTimeMillis() / 1000L).toLong.toString())
params = signRequest(params);
"timestamp" -> (System.currentTimeMillis() / 1000L).toString)
params = signRequest(params)
val builder = new RequestBuilder("GET")
.setUrl(cloudinaryApiUrl("download", resourceType))

for (param <- params) {
builder.addQueryParam(param._1, param._2.toString())
builder.addQueryParam(param._1, param._2.toString)
}
builder.build()
}

def privateDownloadUrl(publicId: String, format: String, resourceType: String = "image", attachment: Option[String] = None, `type`: Option[String] = None) = privateDownload(publicId, format, resourceType, attachment, `type`).getUrl()
def privateDownloadUrl(publicId: String, format: String, resourceType: String = "image", attachment: Option[String] = None, `type`: Option[String] = None) = privateDownload(publicId, format, resourceType, attachment, `type`).getUrl

def zipDownload(tag: String, resourceType: String = "image", transformation: Option[Transformation] = None) = {
var params = Map[String, Any](
"timestamp" -> (System.currentTimeMillis() / 1000L).toLong.toString(),
"timestamp" -> (System.currentTimeMillis() / 1000L).toString,
"tag" -> tag)

transformation match {
Expand All @@ -216,12 +213,12 @@ class Cloudinary(config: Map[String, Any]) {
.setUrl(cloudinaryApiUrl("download_tag.zip", resourceType))

for (param <- params) {
builder.addQueryParam(param._1, param._2.toString())
builder.addQueryParam(param._1, param._2.toString)
}
builder.build()
}

def zipDownloadUrl(tag: String, resourceType: String = "image") = zipDownload(tag, resourceType).getUrl()
def zipDownloadUrl(tag: String, resourceType: String = "image") = zipDownload(tag, resourceType).getUrl

def getBooleanConfig(key: String, defaultValue: Boolean): Boolean =
Cloudinary.asBoolean(config.getOrElse(key, null), defaultValue)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ case class UploadResponse(public_id: String, url: String, secure_url: String, si
override implicit val formats = DefaultFormats + new EnumNameSerializer(ModerationStatus)
def width:Int = (raw \ "width").extractOpt[Int].getOrElse(0)
def height:Int = (raw \ "height").extractOpt[Int].getOrElse(0)
def format:String = (raw \ "format").extractOpt[String].getOrElse(null)
def format:String = (raw \ "format").extractOpt[String].orNull
}
case class LargeRawUploadResponse(public_id: String, url: String, secure_url: String, signature: String, bytes: Long,
resource_type: String, tags: List[String] = List(), upload_id:Option[String], done:Option[Boolean]) extends VersionedResponse with TimestampedResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ import scala.concurrent.duration._
import scala.language.postfixOps
import collection.JavaConverters._

class ApiSpec extends MockableFlatSpec with Matchers with OptionValues with Inside with BeforeAndAfterAll{
class ApiSpec
extends MockableFlatSpec
with Matchers
with OptionValues
with Inside
with BeforeAndAfterAll {

private lazy val api = cloudinary.api()
private lazy val uploader = cloudinary.uploader()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ package com.cloudinary
import java.net.URLDecoder

import com.ning.http.client.multipart.StringPart
import com.ning.http.client.{AsyncHttpClient, AsyncHttpClientConfig, AsyncHttpProvider, Request}
import org.scalamock.clazz.Mock
import com.ning.http.client.{ AsyncHttpClient, AsyncHttpClientConfig, AsyncHttpProvider, Request }
import org.scalamock.scalatest.MockFactory
import org.scalatest.{BeforeAndAfterEach, FlatSpec}
import org.scalatest.{ BeforeAndAfterEach, FlatSpec }

import scala.collection.JavaConverters._

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ class CloudinaryPlugin @Inject() (
"shorten" -> configuration.getBoolean("cloudinary.shorten").getOrElse(false)
))
}
}
}
Loading