Skip to content

Commit

Permalink
Merge fb95da3 into e0063ab
Browse files Browse the repository at this point in the history
  • Loading branch information
aa8y committed Nov 4, 2016
2 parents e0063ab + fb95da3 commit 721a8b9
Show file tree
Hide file tree
Showing 9 changed files with 99 additions and 47 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.swp
.ensime
.ensime_cache
target/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ In order to use MoultingYAML, bring all relevant elements into scope with:

```scala
import net.jcazevedo.moultingyaml._
import net.jcazevedo.moultingyaml.defaultParser._
import net.jcazevedo.moultingyaml.DefaultYamlProtocol._ // if you don't supply your own protocol
```

Expand Down Expand Up @@ -152,6 +153,7 @@ object PalleteYamlProtocol extends DefaultYamlProtocol {

import PalleteYamlProtocol._
import net.jcazevedo.moultingyaml._
import net.jcazevedo.moultingyaml.defaultParser._

val yaml = """name: My Pallete
|colors:
Expand Down
78 changes: 78 additions & 0 deletions src/main/scala/net/jcazevedo/moultingyaml/Parser.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package net.jcazevedo.moultingyaml

import scala.collection.JavaConverters._

import com.github.nscala_time.time.Imports._
import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.constructor.{ Constructor, SafeConstructor }
import org.yaml.snakeyaml.nodes.Tag

class Parser(val tags: Map[String, String]) {
private def convertToYamlValue(obj: Object): YamlValue = obj match {
case m: java.util.Map[Object @unchecked, Object @unchecked] =>
YamlObject(m.asScala.map {
case (k, v) => convertToYamlValue(k) -> convertToYamlValue(v)
}.toMap)
case l: java.util.List[Object @unchecked] =>
YamlArray(l.asScala.map(convertToYamlValue).toVector)
case s: java.util.Set[Object @unchecked] =>
YamlSet(s.asScala.map(convertToYamlValue).toSet)
case i: java.lang.Integer =>
YamlNumber(i.toInt)
case i: java.lang.Long =>
YamlNumber(i.toLong)
case i: java.math.BigInteger =>
YamlNumber(BigInt(i))
case d: java.lang.Double =>
YamlNumber(d.toDouble)
case s: java.lang.String =>
YamlString(s)
case d: java.util.Date =>
YamlDate(new DateTime(d))
case b: java.lang.Boolean =>
YamlBoolean(b)
case ba: Array[Byte] =>
YamlString(new String(ba))
case n if n == null =>
YamlNull
}

// TODO: Make this a val instead. No point in creating a new Constructor object every time we
// want to parse.
// This fails when a val is used instead of a def. But I can't think of any reason why it would
// do that.
private def constructor = new Constructor {
def getConstruct(tagType: String) = tagType match {
case "binary" => new ConstructYamlBinary()
case "boolean" => new ConstructYamlBool()
case "float" => new ConstructYamlFloat()
case "int" => new ConstructYamlInt()
case "map" => new ConstructYamlMap()
case "null" => new ConstructYamlNull()
case "omap" => new ConstructYamlOmap()
case "pairs" => new ConstructYamlPairs()
case "seq" => new ConstructYamlSeq()
case "set" => new ConstructYamlSet()
case "string" => new ConstructYamlStr()
case "timestamp" => new SafeConstructor.ConstructYamlTimestamp()
case _ => SafeConstructor.undefinedConstructor
}
for ((tag, tagType) <- tags) {
yamlConstructors.put(new Tag(tag), getConstruct(tagType))
}
}

// TODO: Create a val with the value new Yaml(constructor) and use it instead of creating a new
// object every time we want to parse. As of now, almost all tests seem to fail when I do this.
// Can't think of a reason why.
implicit class StringParser(val string: String) {
def parseYaml: YamlValue = {
convertToYamlValue(new Yaml(constructor).load(string))
}
def parseYamls: Seq[YamlValue] = {
new Yaml(constructor).loadAll(string).asScala.map(convertToYamlValue).toSeq
}
}
}

object defaultParser extends Parser(Map())
43 changes: 0 additions & 43 deletions src/main/scala/net/jcazevedo/moultingyaml/package.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package net.jcazevedo

import com.github.nscala_time.time.Imports._
import org.yaml.snakeyaml.Yaml
import scala.collection.JavaConverters._

package object moultingyaml {

// format: OFF
Expand All @@ -24,46 +20,7 @@ package object moultingyaml {

def serializationError(msg: String) = throw new SerializationException(msg)

private[moultingyaml] def convertToYamlValue(obj: Object): YamlValue = {
obj match {
case m: java.util.Map[Object @unchecked, Object @unchecked] =>
YamlObject(m.asScala.map {
case (k, v) => convertToYamlValue(k) -> convertToYamlValue(v)
}.toMap)
case l: java.util.List[Object @unchecked] =>
YamlArray(l.asScala.map(convertToYamlValue).toVector)
case s: java.util.Set[Object @unchecked] =>
YamlSet(s.asScala.map(convertToYamlValue).toSet)
case i: java.lang.Integer =>
YamlNumber(i.toInt)
case i: java.lang.Long =>
YamlNumber(i.toLong)
case i: java.math.BigInteger =>
YamlNumber(BigInt(i))
case d: java.lang.Double =>
YamlNumber(d.toDouble)
case s: java.lang.String =>
YamlString(s)
case d: java.util.Date =>
YamlDate(new DateTime(d))
case b: java.lang.Boolean =>
YamlBoolean(b)
case ba: Array[Byte] =>
YamlString(new String(ba))
case n if n == null =>
YamlNull
}
}

implicit class PimpedAny[A](val any: A) extends AnyVal {
def toYaml(implicit writer: YamlWriter[A]): YamlValue = writer.write(any)
}

implicit class PimpedString(val string: String) extends AnyVal {
def parseYaml: YamlValue =
convertToYamlValue(new Yaml().load(string))

def parseYamls: Seq[YamlValue] =
new Yaml().loadAll(string).asScala.map(convertToYamlValue).toSeq
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package net.jcazevedo.moultingyaml

import org.specs2.mutable._

import net.jcazevedo.moultingyaml.defaultParser._

class AdditionalFormatsSpec extends Specification {

case class Container[A](inner: Option[A])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package net.jcazevedo.moultingyaml

import org.specs2.mutable.Specification

import net.jcazevedo.moultingyaml.defaultParser._

class CustomFormatSpec extends Specification with DefaultYamlProtocol {
case class MyType(name: String, value: Int)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package net.jcazevedo.moultingyaml

import org.specs2.mutable._

import net.jcazevedo.moultingyaml.defaultParser._

class ProductFormatsSpec extends Specification {

case class Test0()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ package net.jcazevedo.moultingyaml

import java.io.File
import java.net.URLDecoder
import org.specs2.mutable.Specification

import scala.io.Source

import org.specs2.mutable.Specification

import net.jcazevedo.moultingyaml.defaultParser._

class RoundTripSpec extends Specification {
def getResourceURL(resource: String): String =
URLDecoder.decode(getClass.getResource(resource).getFile, "UTF-8")
Expand Down
10 changes: 7 additions & 3 deletions src/test/scala/net/jcazevedo/moultingyaml/YamlParserSpec.scala
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package net.jcazevedo.moultingyaml

import com.github.nscala_time.time.Imports._
import java.net.URLDecoder
import org.specs2.execute.Result
import org.specs2.mutable._

import scala.io.Source
import scala.util.{ Failure, Success, Try }

import com.github.nscala_time.time.Imports._
import org.specs2.execute.Result
import org.specs2.mutable._

import net.jcazevedo.moultingyaml.defaultParser._

class YamlParserSpec extends Specification {
def getResourceURL(resource: String): String =
URLDecoder.decode(getClass.getResource(resource).getFile, "UTF-8")
Expand Down

0 comments on commit 721a8b9

Please sign in to comment.