Skip to content

Commit

Permalink
fix: Surrounding underscores are now correctly supported
Browse files Browse the repository at this point in the history
* Camel case now preserves leading and trailing underscores to properly support the GraphQL spec
* Now compiles with updated Starscream APIs
  • Loading branch information
shaps80 authored Oct 18, 2023
1 parent 1fcd18c commit fd54087
Show file tree
Hide file tree
Showing 10 changed files with 44 additions and 30 deletions.
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)

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

0 comments on commit fd54087

Please sign in to comment.