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

style: Eliminate right arrows marked with Unicode characters (Use ->, =>) #503

Merged
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
1 change: 1 addition & 0 deletions .scalafix.conf
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
rules = [
UnifiedArrow
RemoveUnused
NoAutoTupling
NoValInForComprehension
Expand Down
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ organization in ThisBuild := "com.iheart"

scalafixDependencies in ThisBuild ++= Seq(
"com.github.liancheng" %% "organize-imports" % "0.6.0",
"net.pixiv" %% "scalafix-pixiv-rule" % "2.2.0"
"net.pixiv" %% "scalafix-pixiv-rule" % "2.4.0"
)

lazy val noPublishSettings = Seq(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ final case class DefinitionGenerator(
case _ =>
appliedType(
t.dealias.typeConstructor,
t.typeArgs.map { arg
t.typeArgs.map { arg =>
dealiasParams(arg.dealias)
}
)
Expand Down Expand Up @@ -62,13 +62,13 @@ final case class DefinitionGenerator(
case _ => new Text("")
}

def definition: ParametricType Definition = {
case parametricType @ ParametricType(tpe, reifiedTypeName, _, _)
def definition: ParametricType => Definition = {
case parametricType @ ParametricType(tpe, reifiedTypeName, _, _) =>
val properties = if (swaggerPlayJava) {
definitionForPOJO(tpe)
} else {
val fields = tpe.decls.collectFirst {
case m: MethodSymbol if m.isPrimaryConstructor m
case m: MethodSymbol if m.isPrimaryConstructor => m
}.toList.flatMap(_.paramLists).headOption.getOrElse(Nil)

val paramDescriptions = if (embedScaladoc) {
Expand Down Expand Up @@ -97,7 +97,7 @@ final case class DefinitionGenerator(
Map.empty[String, String]
}

fields.map { field: Symbol
fields.map { field: Symbol =>
// TODO: find a better way to get the string representation of typeSignature
val name = namingStrategy(field.name.decodedName.toString)

Expand Down Expand Up @@ -126,7 +126,7 @@ final case class DefinitionGenerator(
val beanProperties = beanDesc.findProperties
val ignoreProperties = beanDesc.getIgnoredPropertyNames
val propertySet = JavaConverters.asScalaIteratorConverter(beanProperties.iterator()).asScala.toSeq
propertySet.filter(bd !ignoreProperties.contains(bd.getName)).map { entry
propertySet.filter(bd => !ignoreProperties.contains(bd.getName)).map { entry =>
val name = entry.getName
val className = entry.getPrimaryMember.getType.getRawClass.getName
val generalTypeName = if (entry.getField != null && entry.getField.getType.hasGenericTypes) {
Expand All @@ -151,7 +151,7 @@ final case class DefinitionGenerator(

def allDefinitions(typeNames: Seq[String]): List[Definition] = {
def genSwaggerParameter: PartialFunction[SwaggerParameter, GenSwaggerParameter] = {
case p: GenSwaggerParameter p
case p: GenSwaggerParameter => p
}

def allReferredDefs(defName: String, memo: List[Definition]): List[Definition] = {
Expand All @@ -161,22 +161,22 @@ final case class DefinitionGenerator(
}

memo.find(_.name == defName) match {
case Some(_) memo
case None
case Some(_) => memo
case None =>
val thisDef = definition(defName)
val refNames: Seq[String] = for {
p ← thisDef.properties.collect(genSwaggerParameter)
className ← findRefTypes(p)
if modelQualifier.isModel(className)
} yield className

refNames.foldLeft(thisDef :: memo) { (foundDefs, refName)
refNames.foldLeft(thisDef :: memo) { (foundDefs, refName) =>
allReferredDefs(refName, foundDefs)
}
}
}

typeNames.foldLeft(List.empty[Definition]) { (memo, typeName)
typeNames.foldLeft(List.empty[Definition]) { (memo, typeName) =>
allReferredDefs(typeName, memo)
}
}
Expand Down
20 changes: 10 additions & 10 deletions core/src/main/scala/com/iheart/playSwagger/NamingStrategy.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.iheart.playSwagger

import scala.util.matching.Regex

sealed abstract class NamingStrategy(f: String String) extends (String String) {
sealed abstract class NamingStrategy(f: String => String) extends (String => String) {
override def apply(keyName: String): String = f(keyName)
}

Expand All @@ -11,10 +11,10 @@ object NamingStrategy {
val skipNumberRegex: Regex = "[A-Z]".r

object None extends NamingStrategy(identity)
object SnakeCase extends NamingStrategy(x regex.replaceAllIn(x, { m "_" + m.group(0).toLowerCase() }))
object KebabCase extends NamingStrategy(x regex.replaceAllIn(x, { m "-" + m.group(0).toLowerCase() }))
object LowerCase extends NamingStrategy(x regex.replaceAllIn(x, { m m.group(0).toLowerCase() }))
object UpperCamelCase extends NamingStrategy(x {
object SnakeCase extends NamingStrategy(x => regex.replaceAllIn(x, { m => "_" + m.group(0).toLowerCase() }))
object KebabCase extends NamingStrategy(x => regex.replaceAllIn(x, { m => "-" + m.group(0).toLowerCase() }))
object LowerCase extends NamingStrategy(x => regex.replaceAllIn(x, { m => m.group(0).toLowerCase() }))
object UpperCamelCase extends NamingStrategy(x => {
val (head, tail) = x.splitAt(1)
head.toUpperCase() + tail
})
Expand All @@ -23,11 +23,11 @@ object NamingStrategy {
)

def from(naming: String): NamingStrategy = naming match {
case "snake_case" SnakeCase
case "snake_case" => SnakeCase
case "snake_case_skip_number" => SnakeCaseSkipNumber
case "kebab-case" KebabCase
case "lowercase" LowerCase
case "UpperCamelCase" UpperCamelCase
case _ None
case "kebab-case" => KebabCase
case "lowercase" => LowerCase
case "UpperCamelCase" => UpperCamelCase
case _ => None
}
}
50 changes: 25 additions & 25 deletions core/src/main/scala/com/iheart/playSwagger/OutputTransformer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@ import com.iheart.playSwagger.OutputTransformer.SimpleOutputTransformer
import play.api.libs.json.{JsArray, JsObject, JsString, JsValue}

/** Specialization of a Kleisli function (A => M[B]) */
trait OutputTransformer extends (JsObject Try[JsObject]) {
trait OutputTransformer extends (JsObject => Try[JsObject]) {

/** alias for `andThen` as defined monadic function */
def >=>(b: JsObject Try[JsObject]): OutputTransformer = SimpleOutputTransformer { value: JsObject
def >=>(b: JsObject => Try[JsObject]): OutputTransformer = SimpleOutputTransformer { value: JsObject =>
this.apply(value).flatMap(b)
}
}

object OutputTransformer {
final case class SimpleOutputTransformer(run: (JsObject Try[JsObject])) extends OutputTransformer {
final case class SimpleOutputTransformer(run: (JsObject => Try[JsObject])) extends OutputTransformer {
override def apply(value: JsObject): Try[JsObject] = run(value)
}

def traverseTransformer(vals: JsArray)(transformer: JsValue Try[JsValue]): Try[JsArray] = {
def traverseTransformer(vals: JsArray)(transformer: JsValue => Try[JsValue]): Try[JsArray] = {
val tryElements = vals.value.map {
case value: JsObject traverseTransformer(value)(transformer)
case value: JsArray traverseTransformer(value)(transformer)
case value: JsValue transformer(value)
case value: JsObject => traverseTransformer(value)(transformer)
case value: JsArray => traverseTransformer(value)(transformer)
case value: JsValue => transformer(value)
}.toList

val failures: List[Failure[JsValue]] =
Expand All @@ -36,11 +36,11 @@ object OutputTransformer {
}
}

def traverseTransformer(obj: JsObject)(transformer: JsValue Try[JsValue]): Try[JsObject] = {
def traverseTransformer(obj: JsObject)(transformer: JsValue => Try[JsValue]): Try[JsObject] = {
val tryFields = obj.fields.map {
case (key, value: JsObject) (key, traverseTransformer(value)(transformer))
case (key, values: JsArray) (key, traverseTransformer(values)(transformer))
case (key, value: JsValue) (key, transformer(value))
case (key, value: JsObject) => (key, traverseTransformer(value)(transformer))
case (key, values: JsArray) => (key, traverseTransformer(values)(transformer))
case (key, value: JsValue) => (key, transformer(value))
}
val failures: Seq[(String, Failure[JsValue])] = tryFields
.filter(_._2.isInstanceOf[Failure[_]])
Expand All @@ -49,25 +49,25 @@ object OutputTransformer {
Failure(failures.head._2.exception)
} else {
Success(JsObject(tryFields.asInstanceOf[Seq[(String, Success[JsValue])]].map {
case (key, Success(result)) (key, result)
case (key, Success(result)) => (key, result)
}))
}
}
}

class PlaceholderVariablesTransformer(map: String Option[String], pattern: Regex = "^\\$\\{(.*)\\}$".r)
class PlaceholderVariablesTransformer(map: String => Option[String], pattern: Regex = "^\\$\\{(.*)\\}$".r)
extends OutputTransformer {
def apply(value: JsObject): Try[JsObject] = OutputTransformer.traverseTransformer(value) {
case JsString(pattern(key)) map(key) match {
case Some(result) Success(JsString(result))
case None Failure(new IllegalStateException(s"Unable to find variable $key"))
case JsString(pattern(key)) => map(key) match {
case Some(result) => Success(JsString(result))
case None => Failure(new IllegalStateException(s"Unable to find variable $key"))
}
case e: JsValue Success(e)
case e: JsValue => Success(e)
}
}

final case class MapVariablesTransformer(map: Map[String, String]) extends PlaceholderVariablesTransformer(map.get)
class EnvironmentVariablesTransformer extends PlaceholderVariablesTransformer((key: String)
class EnvironmentVariablesTransformer extends PlaceholderVariablesTransformer((key: String) =>
Option(System.getenv(key))
)

Expand All @@ -76,15 +76,15 @@ class ParametricTypeNamesTransformer extends OutputTransformer {

private def tf(obj: JsObject): JsObject = JsObject {
obj.fields.map {
case (key, value: JsObject) (normalize(key), tf(value))
case (key, JsString(value)) (normalize(key), JsString(normalize(value)))
case (key, other) (normalize(key), other)
case e e
case (key, value: JsObject) => (normalize(key), tf(value))
case (key, JsString(value)) => (normalize(key), JsString(normalize(value)))
case (key, other) => (normalize(key), other)
case e => e
}
}

private final val normalize: String String = {
case ParametricType.ParametricTypeClassName(className, argsGroup)
private final val normalize: String => String = {
case ParametricType.ParametricTypeClassName(className, argsGroup) =>
val normalizedArgs =
argsGroup
.split(",")
Expand All @@ -93,6 +93,6 @@ class ParametricTypeNamesTransformer extends OutputTransformer {
.map(normalize)
.mkString("_")
s"$className-$normalizedArgs"
case n n
case n => n
}
}
12 changes: 6 additions & 6 deletions core/src/main/scala/com/iheart/playSwagger/ParametricType.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ case class ParametricType private (
className: String,
typeArgsMapping: Map[Line, String]
) {
val resolve: String String = {
case ParametricTypeClassName(className, typeArgs)
val resolve: String => String = {
case ParametricTypeClassName(className, typeArgs) =>
val resolvedTypes =
typeArgs
.split(",")
.map(_.trim)
.map(tn typeArgsMapping.getOrElse(tn, resolve(tn)))
.map(tn => typeArgsMapping.getOrElse(tn, resolve(tn)))
s"$className[${resolvedTypes.mkString(",")}]"
case cn typeArgsMapping.getOrElse(cn, cn)
case cn => typeArgsMapping.getOrElse(cn, cn)
}
}

Expand All @@ -30,13 +30,13 @@ object ParametricType {
def apply(reifiedTypeName: String)(implicit cl: ClassLoader): ParametricType = {
val mirror = runtimeMirror(cl)
reifiedTypeName match {
case ParametricTypeClassName(className, typeArgsStr)
case ParametricTypeClassName(className, typeArgsStr) =>
val sym = mirror.staticClass(className)
val tpe = sym.selfType
val typeArgs = typeArgsStr.split(",").map(_.trim).toList
val typeArgsMapping = SortedMap(tpe.typeArgs.map(_.toString).zip(typeArgs): _*)
ParametricType(tpe, reifiedTypeName, className, typeArgsMapping)
case className
case className =>
val sym = mirror.staticClass(className)
val tpe = sym.selfType
ParametricType(tpe, className, className, SortedMap.empty)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,20 @@ object SwaggerParameterMapper {
val typeName = removeKnownPrefixes(parameter.typeName)

val defaultValueO: Option[JsValue] = {
parameter.default.map { value
parameter.default.map { value =>
typeName match {
case ci"Int" | ci"Long" JsNumber(value.toLong)
case ci"Double" | ci"Float" | ci"BigDecimal" JsNumber(value.toDouble)
case ci"Boolean" JsBoolean(value.toBoolean)
case ci"String" {
case ci"Int" | ci"Long" => JsNumber(value.toLong)
case ci"Double" | ci"Float" | ci"BigDecimal" => JsNumber(value.toDouble)
case ci"Boolean" => JsBoolean(value.toBoolean)
case ci"String" => {
val noquotes = value match {
case c if c.startsWith("\"\"\"") && c.endsWith("\"\"\"") c.substring(3, c.length - 3)
case c if c.startsWith("\"") && c.endsWith("\"") c.substring(1, c.length - 1)
case c c
case c if c.startsWith("\"\"\"") && c.endsWith("\"\"\"") => c.substring(3, c.length - 3)
case c if c.startsWith("\"") && c.endsWith("\"") => c.substring(1, c.length - 1)
case c => c
}
JsString(noquotes)
}
case _ JsString(value)
case _ => JsString(value)
}
}
}
Expand All @@ -70,9 +70,9 @@ object SwaggerParameterMapper {
)

val enumParamMF: MappingFunction = {
case JavaEnum(enumConstants) genSwaggerParameter("string", enum = Option(enumConstants))
case ScalaEnum(enumConstants) genSwaggerParameter("string", enum = Option(enumConstants))
case EnumeratumEnum(enumConstants) genSwaggerParameter("string", enum = Option(enumConstants))
case JavaEnum(enumConstants) => genSwaggerParameter("string", enum = Option(enumConstants))
case ScalaEnum(enumConstants) => genSwaggerParameter("string", enum = Option(enumConstants))
case EnumeratumEnum(enumConstants) => genSwaggerParameter("string", enum = Option(enumConstants))
}

def isReference(tpeName: String = typeName): Boolean = modelQualifier.isModel(tpeName)
Expand All @@ -97,37 +97,37 @@ object SwaggerParameterMapper {
asRequired.update(required = false, nullable = true, default = asRequired.default)
}

def updateGenParam(param: SwaggerParameter)(update: GenSwaggerParameter GenSwaggerParameter): SwaggerParameter =
def updateGenParam(param: SwaggerParameter)(update: GenSwaggerParameter => GenSwaggerParameter): SwaggerParameter =
param match {
case p: GenSwaggerParameter update(p)
case _ param
case p: GenSwaggerParameter => update(p)
case _ => param
}

val referenceParamMF: MappingFunction = {
case tpe if isReference(tpe) referenceParam(tpe)
case tpe if isReference(tpe) => referenceParam(tpe)
}

val optionalParamMF: MappingFunction = {
case tpe if higherOrderType("Option", typeName, None).isDefined
case tpe if higherOrderType("Option", typeName, None).isDefined =>
optionalParam(higherOrderType("Option", typeName, None).get)
}

val generalParamMF: MappingFunction = {
case ci"Int" | ci"Integer" genSwaggerParameter("integer", Some("int32"))
case ci"Long" genSwaggerParameter("integer", Some("int64"))
case ci"Double" | ci"BigDecimal" genSwaggerParameter("number", Some("double"))
case ci"Float" genSwaggerParameter("number", Some("float"))
case ci"DateTime" genSwaggerParameter("integer", Some("epoch"))
case ci"java.time.Instant" genSwaggerParameter("string", Some("date-time"))
case ci"java.time.LocalDate" genSwaggerParameter("string", Some("date"))
case ci"java.time.LocalDateTime" genSwaggerParameter("string", Some("date-time"))
case ci"java.time.Duration" genSwaggerParameter("string")
case ci"Any" genSwaggerParameter("any").copy(example = Some(JsString("any JSON value")))
case unknown genSwaggerParameter(unknown.toLowerCase())
case ci"Int" | ci"Integer" => genSwaggerParameter("integer", Some("int32"))
case ci"Long" => genSwaggerParameter("integer", Some("int64"))
case ci"Double" | ci"BigDecimal" => genSwaggerParameter("number", Some("double"))
case ci"Float" => genSwaggerParameter("number", Some("float"))
case ci"DateTime" => genSwaggerParameter("integer", Some("epoch"))
case ci"java.time.Instant" => genSwaggerParameter("string", Some("date-time"))
case ci"java.time.LocalDate" => genSwaggerParameter("string", Some("date"))
case ci"java.time.LocalDateTime" => genSwaggerParameter("string", Some("date-time"))
case ci"java.time.Duration" => genSwaggerParameter("string")
case ci"Any" => genSwaggerParameter("any").copy(example = Some(JsString("any JSON value")))
case unknown => genSwaggerParameter(unknown.toLowerCase())
}

val itemsParamMF: MappingFunction = {
case tpe if collectionItemType(tpe).isDefined
case tpe if collectionItemType(tpe).isDefined =>
// TODO: This could use a different type to represent ItemsObject(http://swagger.io/specification/#itemsObject),
// since the structure is not quite the same, and still has to be handled specially in a json transform (see propWrites in SwaggerSpecGenerator)
// However, that spec conflicts with example code elsewhere that shows other fields in the object, such as properties:
Expand All @@ -139,10 +139,10 @@ object SwaggerParameterMapper {
))
}

val customMappingMF: MappingFunction = customMappings.map { mapping
val customMappingMF: MappingFunction = customMappings.map { mapping =>
val re = StringContext(removeKnownPrefixes(mapping.`type`)).ci
val mf: MappingFunction = {
case re()
case re() =>
CustomSwaggerParameter(
parameter.name,
mapping.specAsParameter,
Expand Down
Loading