Skip to content

Commit

Permalink
KTOR-5397 Make @resource annotation @MetaSerializable (#3328)
Browse files Browse the repository at this point in the history
  • Loading branch information
rsinukov committed Jan 2, 2023
1 parent d34227f commit 9a15ea0
Show file tree
Hide file tree
Showing 8 changed files with 1 addition and 66 deletions.
Expand Up @@ -16,14 +16,11 @@ import io.ktor.resources.Resources as ResourcesCore
*
* Example:
* ```kotlin
* @Serializable
* @Resource("/users")
* data class Users {
* @Serializable
* @Resource("/{id}")
* data class ById(val parent: Users = Users(), val id: Long)
*
* @Serializable
* @Resource("/add")
* data class Add(val parent: Users = Users(), val name: String)
* }
Expand Down
Expand Up @@ -15,10 +15,8 @@ import kotlin.test.*

class ResourcesTest {

@Serializable
@Resource("path/{id}/{method}")
class Path(val id: Long, val method: String) {
@Serializable
@Resource("child/{path?}")
data class Child(val parent: Path, val path: String, val query: List<Int>)
}
Expand Down Expand Up @@ -108,7 +106,6 @@ class ResourcesTest {
}
}

@Serializable
@Resource("path/{id}/{value?}")
class PathWithDefault(val id: Boolean = true, val value: String? = null, val query1: Int?, val query2: Int? = 5)

Expand All @@ -131,7 +128,6 @@ class ResourcesTest {
}
}

@Serializable
@Resource("{path}")
class ParametersEncoded(val path: String, val query: String, val queryList: List<String>)

Expand Down
Expand Up @@ -31,7 +31,6 @@ class ResourcesTestJvm {
}
}

@Serializable
@Resource("/")
class LocationWithBigNumbers(
@Serializable(with = BigDecimalSerializer::class)
Expand Down
Expand Up @@ -15,14 +15,11 @@ import io.ktor.resources.Resources as ResourcesCore
*
* Example:
* ```kotlin
* @Serializable
* @Resource("/users")
* data class Users {
* @Serializable
* @Resource("/{id}")
* data class ById(val parent: Users = Users(), val id: Long)
*
* @Serializable
* @Resource("/add")
* data class Add(val parent: Users = Users(), val name: String)
* }
Expand Down
Expand Up @@ -29,7 +29,6 @@ internal fun withResourcesApplication(test: ApplicationTestBuilder.() -> Unit) =
}

class ResourcesTest {
@Serializable
@Resource("/")
class index

Expand All @@ -47,7 +46,6 @@ class ResourcesTest {

@Test
fun resourceLocal() {
@Serializable
@Resource("/")
class indexLocal
withResourcesApplication {
Expand All @@ -61,7 +59,6 @@ class ResourcesTest {
}
}

@Serializable
@Resource("/about")
class about

Expand All @@ -76,7 +73,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/about/123")
}

@Serializable
@Resource("/user/{id}")
class user(val id: Int)

Expand All @@ -93,7 +89,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/user?id=123")
}

@Serializable
@Resource("/user/{id}/{name}")
class named(val id: Int, val name: String)

Expand All @@ -111,7 +106,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/user/123")
}

@Serializable
@Resource("/favorite")
class favorite(val id: Int)

Expand All @@ -128,10 +122,8 @@ class ResourcesTest {
urlShouldBeUnhandled("/favorite")
}

@Serializable
@Resource("/container/{id}")
class pathContainer(val id: Int) {
@Serializable
@Resource("/items")
class items(val container: pathContainer)
}
Expand All @@ -150,10 +142,8 @@ class ResourcesTest {
urlShouldBeUnhandled("/container/items?id=123")
}

@Serializable
@Resource("/container")
class queryContainer(val id: Int) {
@Serializable
@Resource("/items")
class items(val container: queryContainer)
}
Expand All @@ -172,7 +162,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/container/123/items")
}

@Serializable
@Resource("/container")
class optionalName(val id: Int, val optional: String? = null)

Expand All @@ -190,7 +179,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/container/123")
}

@Serializable
@Resource("/container")
class optionalIndex(val id: Int, val optional: Int = 42)

Expand Down Expand Up @@ -222,10 +210,8 @@ class ResourcesTest {
urlShouldBeUnhandled("/container/123")
}

@Serializable
@Resource("/container/{id?}")
class optionalContainer(val id: Int? = null) {
@Serializable
@Resource("/items")
class items(val parent: optionalContainer, val optional: String? = null)
}
Expand All @@ -250,10 +236,8 @@ class ResourcesTest {
)
}

@Serializable
@Resource("/container")
class simpleContainer {
@Serializable
@Resource("/items")
class items(val parent: simpleContainer)
}
Expand All @@ -273,7 +257,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/items")
}

@Serializable
@Resource("/container/{path...}")
class tailCard(val path: List<String>)

Expand All @@ -289,11 +272,9 @@ class ResourcesTest {
urlShouldBeHandled(tailCard(listOf("123", "items")), "/container/123/items")
}

@Serializable
@Resource("/")
class multiquery(val value: List<Int>)

@Serializable
@Resource("/")
class multiquery2(val name: List<String>)

Expand Down Expand Up @@ -333,7 +314,6 @@ class ResourcesTest {
urlShouldBeHandled(multiquery2(listOf("john, mary")), "2: /?name=john%2C+mary")
}

@Serializable
@Resource("/")
class multiqueryWithDefault(val value: List<Int> = emptyList())

Expand All @@ -347,7 +327,6 @@ class ResourcesTest {
urlShouldBeHandled(multiqueryWithDefault(listOf()), "/ []")
}

@Serializable
@Resource("/")
class root

Expand All @@ -362,7 +341,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/index")
}

@Serializable
@Resource("/help")
class help

Expand All @@ -377,14 +355,11 @@ class ResourcesTest {
urlShouldBeUnhandled("/help/123")
}

@Serializable
@Resource("/users")
class users {
@Serializable
@Resource("/me")
class me(val parent: users)

@Serializable
@Resource("/{id}")
class user(val parent: users, val id: Int)
}
Expand All @@ -408,7 +383,6 @@ class ResourcesTest {
urlShouldBeUnhandled("/users/me")
}

@Serializable
@Resource("/items/{id}")
class items

Expand All @@ -423,11 +397,9 @@ class ResourcesTest {
}
}

@Serializable
@Resource("/items/{itemId}/{extra?}")
class OverlappingPath1(val itemId: Int, val extra: String?)

@Serializable
@Resource("/items/{extra}")
class OverlappingPath2(val extra: String)

Expand All @@ -450,7 +422,6 @@ class ResourcesTest {
A, B, C
}

@Serializable
@Resource("/")
class resourceWithEnum(val e: resourceEnum)

Expand All @@ -472,7 +443,6 @@ class ResourcesTest {

@Test
fun resourceParameterMismatchShouldLeadToBadRequestStatus() = withResourcesApplication {
@Serializable
@Resource("/")
data class L(val text: String, val number: Int, val longNumber: Long)

Expand Down Expand Up @@ -506,7 +476,6 @@ class ResourcesTest {

@Test
fun resourceWithUInt() = withResourcesApplication {
@Serializable
@Resource("/{id}/{valueParam}")
data class Request(val id: UInt, val query: ULong, val valueParam: ValueClass, val valueQuery: ValueClass)

Expand All @@ -522,7 +491,6 @@ class ResourcesTest {
@Test
fun resourceShouldReturnHttpMethodRouteObject() = withResourcesApplication {
@Resource("/resource")
@Serializable
class someResource

routing {
Expand Down
Expand Up @@ -14,7 +14,6 @@ import kotlinx.serialization.*
* Other properties are put into the URL query.
* Example:
* ```
* @Serializable
* @Resource("/users/{id}")
* data class UserById(val id: Long, val properties: List<String>)
*
Expand All @@ -27,14 +26,11 @@ import kotlinx.serialization.*
* You can nest class for better organization, but all nested classes should have a property with an outer class type.
* Example:
* ```kotlin
* @Serializable
* @Resource("/users")
* data class Users {
* @Serializable
* @Resource("/{id}")
* data class ById(val parent: Users = Users(), val id: Long)
*
* @Serializable
* @Resource("/add")
* data class Add(val parent: Users = Users(), val name: String)
* }
Expand All @@ -47,4 +43,5 @@ import kotlinx.serialization.*
@OptIn(ExperimentalSerializationApi::class)
@SerialInfo
@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPEALIAS)
@MetaSerializable
public annotation class Resource(val path: String)
Expand Up @@ -14,7 +14,6 @@ class PathPatternSerializationTest {
private val locationsFormat = ResourcesFormat()

@Resource("some/path/")
@Serializable
class SimplePath

@Test
Expand All @@ -24,10 +23,8 @@ class PathPatternSerializationTest {
}

@Resource("parent/{path}")
@Serializable
class NestedClass {
@Resource("{child}/path")
@Serializable
data class ChildClass(val parent: NestedClass)
}

Expand All @@ -38,22 +35,17 @@ class PathPatternSerializationTest {
}

@Resource("parent/{path}/")
@Serializable
class NestedClassWithSlash {
@Resource("{child}/path")
@Serializable
data class ChildClassWithSlash(val parent: NestedClass)

@Resource("/{child}/path")
@Serializable
data class ChildClassWithoutSlash(val parent: NestedClass)
}

@Resource("parent/{path}")
@Serializable
class NestedClassWithoutSlash {
@Resource("/{child}/path")
@Serializable
data class ChildClassWithSlash(val parent: NestedClass)
}

Expand All @@ -76,13 +68,11 @@ class PathPatternSerializationTest {
}

@Resource("/{child}/path")
@Serializable
data class Container(
val child: MultipleParents
)

@Resource("/{child}/path")
@Serializable
data class MultipleParents(val parent1: NestedClass, val value: String, val parent2: NestedClassWithSlash)

@Test
Expand Down

0 comments on commit 9a15ea0

Please sign in to comment.