From d8c0c039298ce37073dd6e099ffdad746f3da37d Mon Sep 17 00:00:00 2001 From: BenEmdon Date: Wed, 6 Sep 2017 21:40:22 -0400 Subject: [PATCH 1/3] Added an unset method for each nullable field to prevent them from being serialized if explicitly called --- .../graphql_swift_gen/templates/type.swift.erb | 18 +++++++++++++++--- .../GraphQLSupportTests/IntegrationTests.swift | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/codegen/lib/graphql_swift_gen/templates/type.swift.erb b/codegen/lib/graphql_swift_gen/templates/type.swift.erb index 4731dbb..703eda4 100644 --- a/codegen/lib/graphql_swift_gen/templates/type.swift.erb +++ b/codegen/lib/graphql_swift_gen/templates/type.swift.erb @@ -214,15 +214,27 @@ extension <%= schema_name %> { <% when 'INPUT_OBJECT' %> open class <%= type.name %> { <% type.required_input_fields.each do |field| %> - open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> + + open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %> <% end %> <% type.optional_input_fields.each do |field| %> + open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> { didSet { <%= escape_reserved_word(field.camelize_name) %>Seen = true } } + + // Observes if the <%= escape_reserved_word(field.camelize_name) %> property was set. private var <%= escape_reserved_word(field.camelize_name) %>Seen: Bool = false + + // Unsets the <%= escape_reserved_word(field.camelize_name) %> property so that it is not serialized. + @discardableresult + open func unset<%= escape_reserved_word(field.classify_name) %>() -> <%= type.name %> { + <%= escape_reserved_word(field.camelize_name) %> = nil + <%= escape_reserved_word(field.camelize_name) %>Seen = false + return self + } <% end %> public init( @@ -230,9 +242,9 @@ extension <%= schema_name %> { <% input_fields.each do |field| %> <% seperator = field == input_fields.last ? "" : "," %> <% if field.type.non_null? %> - <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %><%= seperator %> + <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %><%= seperator %> <% else %> - <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %>? = nil<%= seperator %> + <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> = nil<%= seperator %> <% end %> <% end %> ) { diff --git a/support/Tests/GraphQLSupportTests/IntegrationTests.swift b/support/Tests/GraphQLSupportTests/IntegrationTests.swift index 02921eb..5f0323d 100644 --- a/support/Tests/GraphQLSupportTests/IntegrationTests.swift +++ b/support/Tests/GraphQLSupportTests/IntegrationTests.swift @@ -70,10 +70,10 @@ class IntegrationTests: XCTestCase { func testInputObjectExplictNilConstructor() { let query = Generated.buildMutation { $0 - .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: .some(nil))) + .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: nil)) } let queryString = String(describing: query) - XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42,negate:null})}") + XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42})}") } func testInputObjectExplictNilSetLater() { From bbc43a06e49f3de53a4ca679d08682ae725fdd05 Mon Sep 17 00:00:00 2001 From: BenEmdon Date: Thu, 7 Sep 2017 13:30:12 -0400 Subject: [PATCH 2/3] Remove all instances of unset Change {field name}Seen => serialize{field name} Expose serialize{field name} publicly --- .../templates/type.swift.erb | 23 +++++++------------ .../IntegrationTests.swift | 10 +++++++- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/codegen/lib/graphql_swift_gen/templates/type.swift.erb b/codegen/lib/graphql_swift_gen/templates/type.swift.erb index 703eda4..fe1239a 100644 --- a/codegen/lib/graphql_swift_gen/templates/type.swift.erb +++ b/codegen/lib/graphql_swift_gen/templates/type.swift.erb @@ -221,20 +221,11 @@ extension <%= schema_name %> { open var <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> { didSet { - <%= escape_reserved_word(field.camelize_name) %>Seen = true + serialize<%= escape_reserved_word(field.classify_name) %> = true } } - - // Observes if the <%= escape_reserved_word(field.camelize_name) %> property was set. - private var <%= escape_reserved_word(field.camelize_name) %>Seen: Bool = false - - // Unsets the <%= escape_reserved_word(field.camelize_name) %> property so that it is not serialized. - @discardableresult - open func unset<%= escape_reserved_word(field.classify_name) %>() -> <%= type.name %> { - <%= escape_reserved_word(field.camelize_name) %> = nil - <%= escape_reserved_word(field.camelize_name) %>Seen = false - return self - } + // Observes if the <%= escape_reserved_word(field.camelize_name) %> property was set, and indicates whether it should be serialized. + open var serialize<%= escape_reserved_word(field.classify_name) %>: Bool <% end %> public init( @@ -244,7 +235,8 @@ extension <%= schema_name %> { <% if field.type.non_null? %> <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %><%= seperator %> <% else %> - <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> = nil<%= seperator %> + <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> = nil, + serialize<%= escape_reserved_word(field.classify_name) %>: Bool = false<%= seperator %> <% end %> <% end %> ) { @@ -252,10 +244,11 @@ extension <%= schema_name %> { self.<%= escape_reserved_word(field.camelize_name) %> = <%= escape_reserved_word(field.camelize_name) %> <% end %> <% type.optional_input_fields.each do |field| %> + self.serialize<%= escape_reserved_word(field.classify_name) %> = serialize<%= escape_reserved_word(field.classify_name) %> <% field_name = escape_reserved_word(field.camelize_name) %> if let <%= field_name %> = <%= field_name %> { - self.<%= field_name %>Seen = true self.<%= field_name %> = <%= field_name %> + self.serialize<%= escape_reserved_word(field.classify_name) %> = true } <% end %> } @@ -266,7 +259,7 @@ extension <%= schema_name %> { fields.append("<%= field.name %>:<%= generate_build_input_code(field.camelize_name, field.type.unwrap_non_null) %>") <% end %> <% type.optional_input_fields.each do |field| %> - if <%= escape_reserved_word(field.camelize_name) %>Seen { + if serialize<%= escape_reserved_word(field.classify_name) %> { if let <%= escape_reserved_word(field.camelize_name) %> = <%= escape_reserved_word(field.camelize_name) %> { fields.append("<%= field.name %>:<%= generate_build_input_code(field.camelize_name, field.type.unwrap_non_null) %>") } else { diff --git a/support/Tests/GraphQLSupportTests/IntegrationTests.swift b/support/Tests/GraphQLSupportTests/IntegrationTests.swift index 5f0323d..7c46bf3 100644 --- a/support/Tests/GraphQLSupportTests/IntegrationTests.swift +++ b/support/Tests/GraphQLSupportTests/IntegrationTests.swift @@ -68,7 +68,7 @@ class IntegrationTests: XCTestCase { XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42,negate:true})}") } - func testInputObjectExplictNilConstructor() { + func testInputObjectOptionalFieldNilConstructor() { let query = Generated.buildMutation { $0 .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: nil)) } @@ -76,6 +76,14 @@ class IntegrationTests: XCTestCase { XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42})}") } + func testInputObjectOptionalFieldExplictNilConstructor() { + let query = Generated.buildMutation { $0 + .setInteger(input: Generated.SetIntegerInput(key: "answer", value: 42, negate: nil, serializeNegate: true)) + } + let queryString = String(describing: query) + XCTAssertEqual(queryString, "mutation{set_integer(input:{key:\"answer\",value:42,negate:null})}") + } + func testInputObjectExplictNilSetLater() { let input = Generated.SetIntegerInput(key: "answer", value: 42) input.negate = nil From e39314a7ab88875bb753b001f6b768ac5ca83d87 Mon Sep 17 00:00:00 2001 From: BenEmdon Date: Thu, 7 Sep 2017 17:18:12 -0400 Subject: [PATCH 3/3] sperator => separator --- codegen/lib/graphql_swift_gen/templates/type.swift.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen/lib/graphql_swift_gen/templates/type.swift.erb b/codegen/lib/graphql_swift_gen/templates/type.swift.erb index fe1239a..50a1591 100644 --- a/codegen/lib/graphql_swift_gen/templates/type.swift.erb +++ b/codegen/lib/graphql_swift_gen/templates/type.swift.erb @@ -231,12 +231,12 @@ extension <%= schema_name %> { public init( <% input_fields = type.required_input_fields + type.optional_input_fields # manually ordered with required fields first %> <% input_fields.each do |field| %> - <% seperator = field == input_fields.last ? "" : "," %> + <% separator = field == input_fields.last ? "" : "," %> <% if field.type.non_null? %> - <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %><%= seperator %> + <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type, non_null: true) %><%= separator %> <% else %> <%= escape_reserved_word(field.camelize_name) %>: <%= swift_input_type(field.type) %> = nil, - serialize<%= escape_reserved_word(field.classify_name) %>: Bool = false<%= seperator %> + serialize<%= escape_reserved_word(field.classify_name) %>: Bool = false<%= separator %> <% end %> <% end %> ) {