diff --git a/Sources/PostgREST/PostgrestClient.swift b/Sources/PostgREST/PostgrestClient.swift index 53ccdc91..f01461d8 100644 --- a/Sources/PostgREST/PostgrestClient.swift +++ b/Sources/PostgREST/PostgrestClient.swift @@ -115,7 +115,7 @@ public actor PostgrestClient { /// - Returns: A PostgrestTransformBuilder instance. /// - Throws: An error if the function call fails. public func rpc( - fn: String, + _ fn: String, params: some Encodable, count: CountOption? = nil ) throws -> PostgrestTransformBuilder { @@ -133,10 +133,10 @@ public actor PostgrestClient { /// - Returns: A PostgrestTransformBuilder instance. /// - Throws: An error if the function call fails. public func rpc( - fn: String, + _ fn: String, count: CountOption? = nil ) throws -> PostgrestTransformBuilder { - try rpc(fn: fn, params: NoParams(), count: count) + try rpc(fn, params: NoParams(), count: count) } } diff --git a/Sources/PostgREST/PostgrestFilterBuilder.swift b/Sources/PostgREST/PostgrestFilterBuilder.swift index 18f9567f..a8a95f75 100644 --- a/Sources/PostgREST/PostgrestFilterBuilder.swift +++ b/Sources/PostgREST/PostgrestFilterBuilder.swift @@ -9,7 +9,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { // MARK: - Filters - public func not(column: String, operator op: Operator, value: URLQueryRepresentable) + public func not(_ column: String, operator op: Operator, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { @@ -29,70 +29,70 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func eq(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func eq(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "eq.\(value.queryValue)")) } return self } - public func neq(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func neq(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "neq.\(value.queryValue)")) } return self } - public func gt(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func gt(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "gt.\(value.queryValue)")) } return self } - public func gte(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func gte(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "gte.\(value.queryValue)")) } return self } - public func lt(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func lt(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "lt.\(value.queryValue)")) } return self } - public func lte(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func lte(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "lte.\(value.queryValue)")) } return self } - public func like(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func like(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "like.\(value.queryValue)")) } return self } - public func ilike(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func ilike(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "ilike.\(value.queryValue)")) } return self } - public func `is`(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func `is`(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "is.\(value.queryValue)")) } return self } - public func `in`(column: String, value: [URLQueryRepresentable]) -> PostgrestFilterBuilder { + public func `in`(_ column: String, value: [URLQueryRepresentable]) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append( URLQueryItem( @@ -104,42 +104,42 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func contains(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func contains(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "cs.\(value.queryValue)")) } return self } - public func rangeLt(column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func rangeLt(_ column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "sl.\(range.queryValue)")) } return self } - public func rangeGt(column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func rangeGt(_ column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "sr.\(range.queryValue)")) } return self } - public func rangeGte(column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func rangeGte(_ column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "nxl.\(range.queryValue)")) } return self } - public func rangeLte(column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func rangeLte(_ column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "nxr.\(range.queryValue)")) } return self } - public func rangeAdjacent(column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder + public func rangeAdjacent(_ column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "adj.\(range.queryValue)")) @@ -147,14 +147,14 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func overlaps(column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func overlaps(_ column: String, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "ov.\(value.queryValue)")) } return self } - public func textSearch(column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { + public func textSearch(_ column: String, range: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append(URLQueryItem(name: column, value: "adj.\(range.queryValue)")) } @@ -162,7 +162,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { } public func textSearch( - column: String, query: URLQueryRepresentable, config: String? = nil, type: TextSearchType? = nil + _ column: String, query: URLQueryRepresentable, config: String? = nil, type: TextSearchType? = nil ) -> PostgrestFilterBuilder { mutableState.withValue { $0.request.query.append( @@ -174,7 +174,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func fts(column: String, query: URLQueryRepresentable, config: String? = nil) + public func fts(_ column: String, query: URLQueryRepresentable, config: String? = nil) -> PostgrestFilterBuilder { mutableState.withValue { @@ -186,7 +186,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func plfts(column: String, query: URLQueryRepresentable, config: String? = nil) + public func plfts(_ column: String, query: URLQueryRepresentable, config: String? = nil) -> PostgrestFilterBuilder { mutableState.withValue { @@ -198,7 +198,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func phfts(column: String, query: URLQueryRepresentable, config: String? = nil) + public func phfts(_ column: String, query: URLQueryRepresentable, config: String? = nil) -> PostgrestFilterBuilder { mutableState.withValue { @@ -210,7 +210,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func wfts(column: String, query: URLQueryRepresentable, config: String? = nil) + public func wfts(_ column: String, query: URLQueryRepresentable, config: String? = nil) -> PostgrestFilterBuilder { mutableState.withValue { @@ -222,7 +222,7 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { return self } - public func filter(column: String, operator: Operator, value: URLQueryRepresentable) + public func filter(_ column: String, operator: Operator, value: URLQueryRepresentable) -> PostgrestFilterBuilder { mutableState.withValue { @@ -248,67 +248,67 @@ public class PostgrestFilterBuilder: PostgrestTransformBuilder { // MARK: - Filter Semantic Improvements - public func equals(column: String, value: String) -> PostgrestFilterBuilder { - eq(column: column, value: value) + public func equals(_ column: String, value: String) -> PostgrestFilterBuilder { + eq(column, value: value) } - public func notEquals(column: String, value: String) -> PostgrestFilterBuilder { - neq(column: column, value: value) + public func notEquals(_ column: String, value: String) -> PostgrestFilterBuilder { + neq(column, value: value) } - public func greaterThan(column: String, value: String) -> PostgrestFilterBuilder { - gt(column: column, value: value) + public func greaterThan(_ column: String, value: String) -> PostgrestFilterBuilder { + gt(column, value: value) } - public func greaterThanOrEquals(column: String, value: String) -> PostgrestFilterBuilder { - gte(column: column, value: value) + public func greaterThanOrEquals(_ column: String, value: String) -> PostgrestFilterBuilder { + gte(column, value: value) } - public func lowerThan(column: String, value: String) -> PostgrestFilterBuilder { - lt(column: column, value: value) + public func lowerThan(_ column: String, value: String) -> PostgrestFilterBuilder { + lt(column, value: value) } - public func lowerThanOrEquals(column: String, value: String) -> PostgrestFilterBuilder { - lte(column: column, value: value) + public func lowerThanOrEquals(_ column: String, value: String) -> PostgrestFilterBuilder { + lte(column, value: value) } - public func rangeLowerThan(column: String, range: String) -> PostgrestFilterBuilder { - rangeLt(column: column, range: range) + public func rangeLowerThan(_ column: String, range: String) -> PostgrestFilterBuilder { + rangeLt(column, range: range) } - public func rangeGreaterThan(column: String, value: String) -> PostgrestFilterBuilder { - rangeGt(column: column, range: value) + public func rangeGreaterThan(_ column: String, value: String) -> PostgrestFilterBuilder { + rangeGt(column, range: value) } - public func rangeGreaterThanOrEquals(column: String, value: String) -> PostgrestFilterBuilder { - rangeGte(column: column, range: value) + public func rangeGreaterThanOrEquals(_ column: String, value: String) -> PostgrestFilterBuilder { + rangeGte(column, range: value) } - public func rangeLowerThanOrEquals(column: String, value: String) -> PostgrestFilterBuilder { - rangeLte(column: column, range: value) + public func rangeLowerThanOrEquals(_ column: String, value: String) -> PostgrestFilterBuilder { + rangeLte(column, range: value) } - public func fullTextSearch(column: String, query: String, config: String? = nil) + public func fullTextSearch(_ column: String, query: String, config: String? = nil) -> PostgrestFilterBuilder { - fts(column: column, query: query, config: config) + fts(column, query: query, config: config) } - public func plainToFullTextSearch(column: String, query: String, config: String? = nil) + public func plainToFullTextSearch(_ column: String, query: String, config: String? = nil) -> PostgrestFilterBuilder { - plfts(column: column, query: query, config: config) + plfts(column, query: query, config: config) } - public func phraseToFullTextSearch(column: String, query: String, config: String? = nil) + public func phraseToFullTextSearch(_ column: String, query: String, config: String? = nil) -> PostgrestFilterBuilder { - phfts(column: column, query: query, config: config) + phfts(column, query: query, config: config) } - public func webFullTextSearch(column: String, query: String, config: String? = nil) + public func webFullTextSearch(_ column: String, query: String, config: String? = nil) -> PostgrestFilterBuilder { - wfts(column: column, query: query, config: config) + wfts(column, query: query, config: config) } } diff --git a/Sources/PostgREST/PostgrestQueryBuilder.swift b/Sources/PostgREST/PostgrestQueryBuilder.swift index 09387428..4e1507a7 100644 --- a/Sources/PostgREST/PostgrestQueryBuilder.swift +++ b/Sources/PostgREST/PostgrestQueryBuilder.swift @@ -9,7 +9,7 @@ public final class PostgrestQueryBuilder: PostgrestBuilder { /// - count: Count algorithm to use to count rows in a table. /// - Returns: A `PostgrestFilterBuilder` instance for further filtering or operations. public func select( - columns: String = "*", + _ columns: String = "*", head: Bool = false, count: CountOption? = nil ) -> PostgrestFilterBuilder { @@ -49,7 +49,7 @@ public final class PostgrestQueryBuilder: PostgrestBuilder { /// - Returns: A `PostgrestFilterBuilder` instance for further filtering or operations. /// - Throws: An error if the insert fails. public func insert( - values: some Encodable, + _ values: some Encodable, returning: PostgrestReturningOptions? = nil, count: CountOption? = nil ) throws -> PostgrestFilterBuilder { @@ -93,7 +93,7 @@ public final class PostgrestQueryBuilder: PostgrestBuilder { /// - Returns: A `PostgrestFilterBuilder` instance for further filtering or operations. /// - Throws: An error if the upsert fails. public func upsert( - values: some Encodable, + _ values: some Encodable, onConflict: String? = nil, returning: PostgrestReturningOptions = .representation, count: CountOption? = nil, @@ -130,7 +130,7 @@ public final class PostgrestQueryBuilder: PostgrestBuilder { /// - Returns: A `PostgrestFilterBuilder` instance for further filtering or operations. /// - Throws: An error if the update fails. public func update( - values: some Encodable, + _ values: some Encodable, returning: PostgrestReturningOptions = .representation, count: CountOption? = nil ) throws -> PostgrestFilterBuilder { diff --git a/Sources/PostgREST/PostgrestTransformBuilder.swift b/Sources/PostgREST/PostgrestTransformBuilder.swift index 2a8e5c0e..0e51a3aa 100644 --- a/Sources/PostgREST/PostgrestTransformBuilder.swift +++ b/Sources/PostgREST/PostgrestTransformBuilder.swift @@ -5,7 +5,7 @@ public class PostgrestTransformBuilder: PostgrestBuilder { /// Performs a vertical filtering with SELECT. /// - Parameters: /// - columns: The columns to retrieve, separated by commas. - public func select(columns: String = "*") -> PostgrestTransformBuilder { + public func select(_ columns: String = "*") -> PostgrestTransformBuilder { // remove whitespaces except when quoted. var quoted = false let cleanedColumns = columns.compactMap { char -> String? in @@ -31,7 +31,7 @@ public class PostgrestTransformBuilder: PostgrestBuilder { /// - nullsFirst: If `true`, `null`s appear first. /// - foreignTable: The foreign table to use (if `column` is a foreign column). public func order( - column: String, + _ column: String, ascending: Bool = true, nullsFirst: Bool = false, foreignTable: String? = nil @@ -61,7 +61,7 @@ public class PostgrestTransformBuilder: PostgrestBuilder { /// - Parameters: /// - count: The maximum no. of rows to limit to. /// - foreignTable: The foreign table to use (for foreign columns). - public func limit(count: Int, foreignTable: String? = nil) -> PostgrestTransformBuilder { + public func limit(_ count: Int, foreignTable: String? = nil) -> PostgrestTransformBuilder { mutableState.withValue { let key = foreignTable.map { "\($0).limit" } ?? "limit" if let index = $0.request.query.firstIndex(where: { $0.name == key }) { diff --git a/Tests/PostgRESTIntegrationTests/IntegrationTests.swift b/Tests/PostgRESTIntegrationTests/IntegrationTests.swift index 93276b8a..08513c34 100644 --- a/Tests/PostgRESTIntegrationTests/IntegrationTests.swift +++ b/Tests/PostgRESTIntegrationTests/IntegrationTests.swift @@ -53,8 +53,8 @@ final class IntegrationTests: XCTestCase { // Run fresh test by deleting all data. Delete without a where clause isn't supported, so have // to do this `neq` trick to delete all data. - try await client.from("todos").delete().neq(column: "id", value: UUID().uuidString).execute() - try await client.from("users").delete().neq(column: "id", value: UUID().uuidString).execute() + try await client.from("todos").delete().neq("id", value: UUID().uuidString).execute() + try await client.from("users").delete().neq("id", value: UUID().uuidString).execute() } func testIntegration() async throws { @@ -63,7 +63,7 @@ final class IntegrationTests: XCTestCase { let insertedTodo: Todo = try await client.from("todos") .insert( - values: NewTodo( + NewTodo( description: "Implement integration tests for postgrest-swift", tags: ["tag 01", "tag 02"] ), @@ -78,7 +78,7 @@ final class IntegrationTests: XCTestCase { let insertedTodos: [Todo] = try await client.from("todos") .insert( - values: [ + [ NewTodo(description: "Make supabase swift libraries production ready", tags: ["tag 01"]), NewTodo(description: "Drink some coffee", tags: ["tag 02"]), ], @@ -92,8 +92,8 @@ final class IntegrationTests: XCTestCase { let drinkCoffeeTodo = insertedTodos[1] let updatedTodo: Todo = try await client.from("todos") - .update(values: ["is_complete": true]) - .eq(column: "id", value: drinkCoffeeTodo.id.uuidString) + .update(["is_complete": true]) + .eq("id", value: drinkCoffeeTodo.id.uuidString) .single() .execute() .value @@ -101,17 +101,17 @@ final class IntegrationTests: XCTestCase { let completedTodos: [Todo] = try await client.from("todos") .select() - .eq(column: "is_complete", value: true) + .eq("is_complete", value: true) .execute() .value XCTAssertEqual(completedTodos, [updatedTodo]) - try await client.from("todos").delete().eq(column: "is_complete", value: true).execute() + try await client.from("todos").delete().eq("is_complete", value: true).execute() todos = try await client.from("todos").select().execute().value XCTAssertTrue(completedTodos.allSatisfy { todo in !todos.contains(todo) }) let todosWithSpecificTag: [Todo] = try await client.from("todos").select() - .contains(column: "tags", value: ["tag 01"]).execute().value + .contains("tags", value: ["tag 01"]).execute().value XCTAssertEqual(todosWithSpecificTag, [insertedTodo, insertedTodos[0]]) } @@ -122,10 +122,10 @@ final class IntegrationTests: XCTestCase { User(email: "johndoe+test2@mail.com"), ] - try await client.from("users").insert(values: users).execute() + try await client.from("users").insert(users).execute() let fetchedUsers: [User] = try await client.from("users").select() - .ilike(column: "email", value: "johndoe+test%").execute().value + .ilike("email", value: "johndoe+test%").execute().value XCTAssertEqual( fetchedUsers[...], users[1 ... 2] diff --git a/Tests/PostgRESTTests/BuildURLRequestTests.swift b/Tests/PostgRESTTests/BuildURLRequestTests.swift index 57b0bfd5..bb315f4c 100644 --- a/Tests/PostgRESTTests/BuildURLRequestTests.swift +++ b/Tests/PostgRESTTests/BuildURLRequestTests.swift @@ -50,57 +50,57 @@ final class BuildURLRequestTests: XCTestCase { TestCase(name: "select all users where email ends with '@supabase.co'") { client in await client.from("users") .select() - .like(column: "email", value: "%@supabase.co") + .like("email", value: "%@supabase.co") }, TestCase(name: "insert new user") { client in try await client.from("users") - .insert(values: ["email": "johndoe@supabase.io"]) + .insert(["email": "johndoe@supabase.io"]) }, TestCase(name: "call rpc") { client in - try await client.rpc(fn: "test_fcn", params: ["KEY": "VALUE"]) + try await client.rpc("test_fcn", params: ["KEY": "VALUE"]) }, TestCase(name: "call rpc without parameter") { client in - try await client.rpc(fn: "test_fcn") + try await client.rpc("test_fcn") }, TestCase(name: "test all filters and count") { client in var query = await client.from("todos").select() for op in PostgrestFilterBuilder.Operator.allCases { - query = query.filter(column: "column", operator: op, value: "Some value") + query = query.filter("column", operator: op, value: "Some value") } return query }, TestCase(name: "test in filter") { client in - await client.from("todos").select().in(column: "id", value: [1, 2, 3]) + await client.from("todos").select().in("id", value: [1, 2, 3]) }, TestCase(name: "test contains filter with dictionary") { client in - await client.from("users").select(columns: "name") - .contains(column: "address", value: ["postcode": 90210]) + await client.from("users").select("name") + .contains("address", value: ["postcode": 90210]) }, TestCase(name: "test contains filter with array") { client in await client.from("users") .select() - .contains(column: "name", value: ["is:online", "faction:red"]) + .contains("name", value: ["is:online", "faction:red"]) }, TestCase(name: "test upsert not ignoring duplicates") { client in try await client.from("users") - .upsert(values: ["email": "johndoe@supabase.io"]) + .upsert(["email": "johndoe@supabase.io"]) }, TestCase(name: "test upsert ignoring duplicates") { client in try await client.from("users") - .upsert(values: ["email": "johndoe@supabase.io"], ignoreDuplicates: true) + .upsert(["email": "johndoe@supabase.io"], ignoreDuplicates: true) }, TestCase(name: "query with + character") { client in await client.from("users") .select() - .eq(column: "id", value: "Cigányka-ér (0+400 cskm) vízrajzi állomás") + .eq("id", value: "Cigányka-ér (0+400 cskm) vízrajzi állomás") }, TestCase(name: "query with timestampz") { client in await client.from("tasks") .select() - .gt(column: "received_at", value: "2023-03-23T15:50:30.511743+00:00") - .order(column: "received_at") + .gt("received_at", value: "2023-03-23T15:50:30.511743+00:00") + .order("received_at") }, ]