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

KTOR-5397 Make @Resource annotation @MetaSerializable #3328

Merged
merged 1 commit into from Jan 2, 2023
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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