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

Surrounding underscores are now correctly supported #164

Merged
merged 3 commits into from
Oct 18, 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
8 changes: 5 additions & 3 deletions Sources/GraphQLWebSocket/Client.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ public class GraphQLWebSocket: WebSocketDelegate {
case connecting

/// WebSocket has opened.
case opened(socket: WebSocket)
case opened(socket: WebSocketClient)

/// Open WebSocket connection has been acknowledged
case acknowledged(payload: [String: AnyCodable]?)

Expand Down Expand Up @@ -143,7 +143,7 @@ public class GraphQLWebSocket: WebSocketDelegate {

// MARK: - Internals

public func didReceive(event: WebSocketEvent, client: WebSocket) {
public func didReceive(event: WebSocketEvent, client: WebSocketClient) {
self.config.logger.debug("Received a new message from the server!")

switch event {
Expand Down Expand Up @@ -219,6 +219,8 @@ public class GraphQLWebSocket: WebSocketDelegate {
self.close(code: closeCode)
break

case .peerClosed:
self.close(code: 1006)
}
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftGraphQL/Document/Field.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public enum GraphQLField {
switch self {
case let .leaf(name, parent, arguments),
let .composite(name, parent, _, arguments, _):
return "\(name.camelCase)\(parent.camelCase)_\(arguments.hash)"
return "\(name.camelCasePreservingSurroundingUnderscores)\(parent.camelCasePreservingSurroundingUnderscores)_\(arguments.hash)"
case .fragment:
return nil
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftGraphQLCodegen/Generator/Codable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ private extension Collection where Element == ObjectTypeRef {
/// Returns an enumerator that we use to decode typename field.
func typenamesEnum() -> String {
let types = self
.map { "case \($0.name.camelCase.normalize) = \"\($0.name)\"" }
.map { "case \($0.name.camelCasePreservingSurroundingUnderscores.normalize) = \"\($0.name)\"" }
.joined(separator: "\n")

return """
Expand Down
4 changes: 2 additions & 2 deletions Sources/SwiftGraphQLCodegen/Generator/Enum.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ extension EnumType {
/// Mock value declaration.
private var mock: String {
let value = self.enumValues.first!
return "public static var mockValue = Self.\(value.name.camelCase.normalize)"
return "public static var mockValue = Self.\(value.name.camelCasePreservingSurroundingUnderscores.normalize)"
}
}

Expand All @@ -70,7 +70,7 @@ extension EnumValue {
fileprivate var declaration: String {
"""
\(docs)
case \(name.camelCase.normalize) = "\(name)"
case \(name.camelCasePreservingSurroundingUnderscores.normalize) = "\(name)"
"""
}

Expand Down
8 changes: 4 additions & 4 deletions Sources/SwiftGraphQLCodegen/Generator/Field.swift
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ extension Field {
}

private var fName: String {
name.camelCase.normalize
name.camelCasePreservingSurroundingUnderscores.normalize
}

private func fParameters(context: Context) throws -> String {
Expand Down Expand Up @@ -148,7 +148,7 @@ private extension Collection where Element == InputValue {
/// Returns a one-to-one argument mapping.
func arguments(field: Field, context: Context) -> String {
let args = self
.map { $0.name.camelCase }.map { "\($0): \($0.normalize)" }
.map { $0.name.camelCasePreservingSurroundingUnderscores }.map { "\($0): \($0.normalize)" }
.joined(separator: ", ")

switch field.type.namedType {
Expand All @@ -166,7 +166,7 @@ private extension Collection where Element == InputValue {
extension InputValue {
/// Generates a function parameter for this input value.
fileprivate func parameter(context: Context) throws -> String {
"\(name.camelCase.normalize): \(try type.type(scalars: context.scalars)) \(self.default)"
"\(name.camelCasePreservingSurroundingUnderscores.normalize): \(try type.type(scalars: context.scalars)) \(self.default)"
}

/// Returns the default value of the parameter.
Expand Down Expand Up @@ -224,7 +224,7 @@ private extension Collection where Element == InputValue {
private extension InputValue {
/// Returns a SwiftGraphQL Argument definition for a given input value.
var argument: String {
#"Argument(name: "\#(name)", type: "\#(type.argument)", value: \#(name.camelCase.normalize))"#
#"Argument(name: "\#(name)", type: "\#(type.argument)", value: \#(name.camelCasePreservingSurroundingUnderscores.normalize))"#
}
}

Expand Down
8 changes: 4 additions & 4 deletions Sources/SwiftGraphQLCodegen/Generator/Fragments.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,19 @@ extension Collection where Element == ObjectTypeRef {

/// Type used to
private var mock: String {
self.first!.namedType.name.camelCase
self.first!.namedType.name.camelCasePreservingSurroundingUnderscores
}
}

private extension ObjectTypeRef {
/// Returns a parameter definition for a given type reference.
var parameter: String {
"\(namedType.name.camelCase): Selection<T, Objects.\(namedType.name.pascalCase)>"
"\(namedType.name.camelCasePreservingSurroundingUnderscores): Selection<T, Objects.\(namedType.name.pascalCase)>"
}

/// Returns a SwiftGraphQL Fragment selection.
func fragment(interface: String) -> String {
#"GraphQLField.fragment(type: "\#(namedType.name)", interface: "\#(interface)", selection: \#(namedType.name.camelCase).__selection())"#
#"GraphQLField.fragment(type: "\#(namedType.name)", interface: "\#(interface)", selection: \#(namedType.name.camelCasePreservingSurroundingUnderscores).__selection())"#
}

/// Returns a decoder for a fragment.
Expand All @@ -70,7 +70,7 @@ private extension ObjectTypeRef {
let name = namedType.name
return """
case "\(name)":
return try \(name.camelCase).__decode(data: data)
return try \(name.camelCasePreservingSurroundingUnderscores).__decode(data: data)
"""
}
}
10 changes: 5 additions & 5 deletions Sources/SwiftGraphQLCodegen/Generator/InputObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,19 @@ extension InputValue {
fileprivate func declaration(context: Context) throws -> String {
"""
\(docs)
public var \(name.camelCase.normalize): \(try type.type(scalars: context.scalars))
public var \(name.camelCasePreservingSurroundingUnderscores.normalize): \(try type.type(scalars: context.scalars))
"""
}

fileprivate func initDeclaration(context: Context, isLast: Bool) throws -> String {
"""
\(name.camelCase.normalize): \(try type.type(scalars: context.scalars))\(self.default)
\(name.camelCasePreservingSurroundingUnderscores.normalize): \(try type.type(scalars: context.scalars))\(self.default)
"""
}

fileprivate func initFields(context: Context) throws -> String {
"""
self.\(name.camelCase.normalize) = \(name.camelCase.normalize)
self.\(name.camelCasePreservingSurroundingUnderscores.normalize) = \(name.camelCasePreservingSurroundingUnderscores.normalize)
"""
}

Expand Down Expand Up @@ -138,7 +138,7 @@ private extension Collection where Element == InputValue {
private extension InputValue {
/// Returns an encoder for this input value.
var encoder: String {
let key = name.camelCase.normalize
let key = name.camelCasePreservingSurroundingUnderscores.normalize

switch type.inverted {
case .nullable:
Expand All @@ -152,6 +152,6 @@ private extension InputValue {

/// Returns a coding key for this input value.
var codingKey: String {
"case \(name.camelCase.normalize) = \"\(name)\""
"case \(name.camelCasePreservingSurroundingUnderscores.normalize) = \"\(name)\""
}
}
18 changes: 15 additions & 3 deletions Sources/SwiftGraphQLUtils/Extensions/String+Case.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,21 @@ extension String {
return result
}

/// Returns the string camelCased.
public var camelCase: String {
/// Returns the string – camelCased – while retaining all leading and trailing underscores
///
/// _foo_ // returns _foo_
/// ___foo_bar___ // returns ___fooBar___
///
public var camelCasePreservingSurroundingUnderscores: String {
let leading = prefix { $0 == "_" }
let remainder = dropFirst(leading.count)
let trimmed = remainder.trimmingCharacters(in: CharacterSet(["_"]))
let trailing = String.SubSequence(repeating: "_", count: remainder.count - trimmed.count)
maticzav marked this conversation as resolved.
Show resolved Hide resolved

let pascal = pascalCase
return pascal[pascal.startIndex].lowercased() + pascal.dropFirst()
return String(leading)
+ pascal[pascal.startIndex].lowercased()
+ pascal.dropFirst()
+ String(trailing)
}
}
4 changes: 2 additions & 2 deletions Tests/SwiftGraphQLCodegenTests/Generator/EnumTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ final class EnumTests: XCTestCase {
deprecationReason: "Was too good."
),
EnumValue(
name: "SKYWALKER",
name: "_SKYWALKER__",
description: nil,
isDeprecated: true,
deprecationReason: nil
Expand All @@ -53,7 +53,7 @@ final class EnumTests: XCTestCase {
/// Released in 1983.
case jedi = "JEDI"

case skywalker = "SKYWALKER"
case _skywalker__ = "_SKYWALKER__"
}
}

Expand Down
10 changes: 5 additions & 5 deletions Tests/SwiftGraphQLUtilsTests/Extensions/String+CaseTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import XCTest

final class StringExtensionsTest: XCTestCase {
func testCamelCase() {
XCTAssertEqual("___a very peculiarNameIndeed__wouldNot.you.agree.AMAZING?____".camelCase, "aVeryPeculiarNameIndeedWouldNotYouAgreeAmazing")
XCTAssertEqual("ENUM".camelCase, "enum")
XCTAssertEqual("linkToURL".camelCase, "linkToUrl")
XCTAssertEqual("grandfather_father.son grandson".camelCase, "grandfatherFatherSonGrandson")
XCTAssertEqual("queryDBShortcuts".camelCase, "queryDbShortcuts")
XCTAssertEqual("___a very peculiarNameIndeed__wouldNot.you.agree.AMAZING?____".camelCasePreservingSurroundingUnderscores, "___aVeryPeculiarNameIndeedWouldNotYouAgreeAmazing____")
XCTAssertEqual("ENUM".camelCasePreservingSurroundingUnderscores, "enum")
XCTAssertEqual("linkToURL".camelCasePreservingSurroundingUnderscores, "linkToUrl")
XCTAssertEqual("grandfather_father.son grandson".camelCasePreservingSurroundingUnderscores, "grandfatherFatherSonGrandson")
XCTAssertEqual("queryDBShortcuts".camelCasePreservingSurroundingUnderscores, "queryDbShortcuts")
}

func testPascalCase() {
Expand Down