From e104a4ede247c0be213fa73e39a72f6d5cf2c2ad Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Tue, 2 Feb 2021 14:37:40 +0100 Subject: [PATCH 01/36] RUMM-1000 Fix typo defaultVaule -> defaultValue --- .../JSONSchemaToJSONTypeTransformer.swift | 2 +- .../Input/JSON/JSONType.swift | 2 +- .../Swift/JSONToSwiftTypeTransformer.swift | 4 +-- .../Input/Swift/SwiftType.swift | 2 +- .../Output/Printing/SwiftPrinter.swift | 2 +- .../RUM/RUMSwiftTypeTransformer.swift | 2 +- ...JSONSchemaToJSONTypeTransformerTests.swift | 10 +++--- .../JSONToSwiftTypeTransformerTests.swift | 20 ++++++------ .../Output/ObjcInteropPrinterTests.swift | 2 +- .../Output/SwiftPrinterTests.swift | 10 +++--- .../RUM/RUMSwiftTypeTransformerTests.swift | 32 +++++++++---------- 11 files changed, 44 insertions(+), 44 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift index b390bd654a..c143fa0e33 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift @@ -99,7 +99,7 @@ internal class JSONSchemaToJSONTypeTransformer { name: propertyName, comment: propertySchema.description, type: try transformSchemaToAnyType(propertySchema, named: propertyName), - defaultVaule: propertySchema.const.flatMap { const in + defaultValue: propertySchema.const.flatMap { const in switch const.value { case .integer(let value): return .integer(value: value) case .string(let value): return .string(value: value) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift index af75d08d5c..11ee77b794 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift @@ -36,7 +36,7 @@ internal struct JSONObject: JSONType { let name: String let comment: String? let type: JSONType - let defaultVaule: DefaultValue? + let defaultValue: DefaultValue? let isRequired: Bool let isReadOnly: Bool } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index ec81c7d594..0e81bee061 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -66,7 +66,7 @@ internal class JSONToSwiftTypeTransformer { func readProperties(from objectProperties: [JSONObject.Property]) throws -> [SwiftStruct.Property] { /// Reads Struct property default value. func readDefaultValue(for objectProperty: JSONObject.Property) throws -> SwiftPropertyDefaultValue? { - return objectProperty.defaultVaule.ifNotNil { value in + return objectProperty.defaultValue.ifNotNil { value in switch value { case .integer(let intValue): return intValue @@ -87,7 +87,7 @@ internal class JSONToSwiftTypeTransformer { type: try transformJSONToAnyType(jsonProperty.type), isOptional: !jsonProperty.isRequired, isMutable: !jsonProperty.isReadOnly, - defaultVaule: try readDefaultValue(for: jsonProperty), + defaultValue: try readDefaultValue(for: jsonProperty), codingKey: jsonProperty.name ) } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift index 36d09117b8..13cafacc58 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift @@ -47,7 +47,7 @@ internal struct SwiftStruct: SwiftType { var type: SwiftType var isOptional: Bool var isMutable: Bool - var defaultVaule: SwiftPropertyDefaultValue? + var defaultValue: SwiftPropertyDefaultValue? var codingKey: String } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index 9c4e454c9e..d0e5e9b6d9 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -56,7 +56,7 @@ public class SwiftPrinter: BasePrinter { let name = property.name let type = try typeDeclaration(property.type) let optionality = property.isOptional ? "?" : "" - let defaultValue: String? = try property.defaultVaule.ifNotNil { value in + let defaultValue: String? = try property.defaultValue.ifNotNil { value in switch value { case let integerValue as Int: return " = \(integerValue)" diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index 01383d4948..163da85feb 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -88,7 +88,7 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { var structProperty = structProperty structProperty.name = format(propertyName: structProperty.name) structProperty.type = try transformAny(type: structProperty.type) - structProperty.defaultVaule = structProperty.defaultVaule.ifNotNil { transform(defaultValue: $0) } + structProperty.defaultValue = structProperty.defaultValue.ifNotNil { transform(defaultValue: $0) } return structProperty } diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift index 49f7d01070..170d4d3c5b 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift @@ -97,7 +97,7 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { name: "property1", comment: "Description of Bar's `property1`.", type: JSONPrimitive.string, - defaultVaule: nil, + defaultValue: nil, isRequired: false, isReadOnly: true ), @@ -105,13 +105,13 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { name: "property2", comment: "Description of Bar's `property2`.", type: JSONPrimitive.string, - defaultVaule: nil, + defaultValue: nil, isRequired: true, isReadOnly: false ) ] ), - defaultVaule: nil, + defaultValue: nil, isRequired: false, isReadOnly: true ), @@ -123,7 +123,7 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { comment: "Description of Foo's `property1`.", values: ["case1", "case2", "case3", "case4"] ), - defaultVaule: JSONObject.Property.DefaultValue.string(value: "case2"), + defaultValue: JSONObject.Property.DefaultValue.string(value: "case2"), isRequired: true, isReadOnly: true ), @@ -137,7 +137,7 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { values: ["option1", "option2", "option3", "option4"] ) ), - defaultVaule: nil, + defaultValue: nil, isRequired: false, isReadOnly: false ) diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index 2428627d35..4ee2cdc6bf 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -24,7 +24,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { name: "property1", comment: "Description of Bar's `property1`.", type: JSONPrimitive.string, - defaultVaule: nil, + defaultValue: nil, isRequired: false, isReadOnly: true ), @@ -32,13 +32,13 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { name: "property2", comment: "Description of Bar's `property2`.", type: JSONPrimitive.string, - defaultVaule: nil, + defaultValue: nil, isRequired: true, isReadOnly: false ) ] ), - defaultVaule: nil, + defaultValue: nil, isRequired: false, isReadOnly: true ), @@ -50,7 +50,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { comment: "Description of Foo's `property1`.", values: ["case1", "case2", "case3", "case4"] ), - defaultVaule: JSONObject.Property.DefaultValue.string(value: "case2"), + defaultValue: JSONObject.Property.DefaultValue.string(value: "case2"), isRequired: true, isReadOnly: true ), @@ -64,7 +64,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { values: ["option1", "option2", "option3", "option4"] ) ), - defaultVaule: nil, + defaultValue: nil, isRequired: false, isReadOnly: false ) @@ -88,7 +88,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { type: SwiftPrimitive(), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "property1" ), SwiftStruct.Property( @@ -97,7 +97,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { type: SwiftPrimitive(), isOptional: false, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], @@ -105,7 +105,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: true, // should be mutable as at least one of the `Bar's` properties is mutable - defaultVaule: nil, + defaultValue: nil, codingKey: "bar" ), SwiftStruct.Property( @@ -124,7 +124,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { ), isOptional: false, isMutable: false, - defaultVaule: SwiftEnum.Case(label: "case2", rawValue: "case2"), + defaultValue: SwiftEnum.Case(label: "case2", rawValue: "case2"), codingKey: "property1" ), SwiftStruct.Property( @@ -145,7 +145,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift index 159a55a44e..1d75608ca5 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift @@ -1575,7 +1575,7 @@ extension SwiftStruct.Property { type: type, isOptional: isOptional, isMutable: isMutable, - defaultVaule: nil, + defaultValue: nil, codingKey: propertyName ) } diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index a73dbf957a..3ed9e2f256 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -25,7 +25,7 @@ final class SwiftPrinterTests: XCTestCase { type: SwiftPrimitive(), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "property1" ), SwiftStruct.Property( @@ -34,7 +34,7 @@ final class SwiftPrinterTests: XCTestCase { type: SwiftPrimitive(), isOptional: false, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], @@ -42,7 +42,7 @@ final class SwiftPrinterTests: XCTestCase { ), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "bar" ), SwiftStruct.Property( @@ -61,7 +61,7 @@ final class SwiftPrinterTests: XCTestCase { ), isOptional: false, isMutable: false, - defaultVaule: SwiftEnum.Case(label: "case2", rawValue: "case2"), + defaultValue: SwiftEnum.Case(label: "case2", rawValue: "case2"), codingKey: "bizz" ), SwiftStruct.Property( @@ -82,7 +82,7 @@ final class SwiftPrinterTests: XCTestCase { ), isOptional: true, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "buzz" ) ], diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift index f774889fcf..ec6558386b 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift @@ -26,7 +26,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftPrimitive(), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "property1" ), SwiftStruct.Property( @@ -35,7 +35,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftPrimitive(), isOptional: false, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], @@ -43,7 +43,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "bar" ), SwiftStruct.Property( @@ -62,7 +62,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: false, isMutable: false, - defaultVaule: SwiftEnum.Case(label: "case2", rawValue: "case2"), + defaultValue: SwiftEnum.Case(label: "case2", rawValue: "case2"), codingKey: "property1" ), SwiftStruct.Property( @@ -83,7 +83,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], @@ -110,7 +110,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftPrimitive(), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "property1" ), SwiftStruct.Property( @@ -119,7 +119,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftPrimitive(), isOptional: false, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], @@ -127,7 +127,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "bar" ), SwiftStruct.Property( @@ -146,7 +146,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: false, isMutable: false, - defaultVaule: SwiftEnum.Case(label: "case2", rawValue: "case2"), + defaultValue: SwiftEnum.Case(label: "case2", rawValue: "case2"), codingKey: "property1" ), SwiftStruct.Property( @@ -167,7 +167,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: true, - defaultVaule: nil, + defaultValue: nil, codingKey: "property2" ) ], @@ -194,7 +194,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "connectivity" ), SwiftStruct.Property( @@ -208,7 +208,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "usr" ), SwiftStruct.Property( @@ -222,7 +222,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { ), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "method" ) ], @@ -242,7 +242,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftTypeReference(referencedTypeName: "RUMConnectivity"), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "connectivity" ), SwiftStruct.Property( @@ -251,7 +251,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftTypeReference(referencedTypeName: "RUMUser"), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "usr" ), SwiftStruct.Property( @@ -260,7 +260,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { type: SwiftTypeReference(referencedTypeName: "RUMMethod"), isOptional: true, isMutable: false, - defaultVaule: nil, + defaultValue: nil, codingKey: "method" ) ], From 4f1e0775edb0976658dbd338efd07013dc3f7884 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Tue, 2 Feb 2021 18:02:55 +0100 Subject: [PATCH 02/36] RUMM-1000 Add additionalProperties to JSONSchema and JSONObject --- .../Input/JSON/JSONSchema.swift | 4 ++ .../JSONSchemaToJSONTypeTransformer.swift | 27 ++++++++++- .../Input/JSON/JSONType.swift | 4 +- ...JSONSchemaToJSONTypeTransformerTests.swift | 48 ++++++++++++++++++- 4 files changed, 79 insertions(+), 4 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchema.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchema.swift index 1ed34f31d8..d1cbd98c38 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchema.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchema.swift @@ -16,6 +16,7 @@ internal class JSONSchema: Decodable { case title = "title" case description = "description" case properties = "properties" + case additionalProperties = "additionalProperties" case required = "required" case type = "type" case `enum` = "enum" @@ -65,6 +66,7 @@ internal class JSONSchema: Decodable { private(set) var title: String? private(set) var description: String? private(set) var properties: [String: JSONSchema]? + private(set) var additionalProperties: JSONSchema? private(set) var required: [String]? private(set) var type: SchemaType? private(set) var `enum`: [String]? @@ -143,6 +145,8 @@ internal class JSONSchema: Decodable { self.properties = self.properties ?? otherSchema.properties } + self.additionalProperties = self.additionalProperties ?? otherSchema.additionalProperties + // Required properties are accumulated. if let selfRequired = self.required, let otherRequired = otherSchema.required { self.required = selfRequired + otherRequired diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift index c143fa0e33..53b9316956 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift @@ -112,6 +112,31 @@ internal class JSONSchemaToJSONTypeTransformer { properties.append(property) } - return JSONObject(name: name, comment: schema.description, properties: properties) + let additionalProperties: JSONObject.Property? + if let additionalPropertiesSchema = schema.additionalProperties { + let propName = JSONSchema.CodingKeys.additionalProperties.rawValue + additionalProperties = JSONObject.Property( + name: propName, + comment: additionalPropertiesSchema.description, + type: try transformSchemaToAnyType(additionalPropertiesSchema, named: propName), + defaultValue: additionalPropertiesSchema.const.flatMap { const in + switch const.value { + case .integer(let value): return .integer(value: value) + case .string(let value): return .string(value: value) + } + }, + isRequired: false, + isReadOnly: additionalPropertiesSchema.readOnly ?? Defaults.isReadOnly + ) + } else { + additionalProperties = nil + } + + return JSONObject( + name: name, + comment: schema.description, + properties: properties, + additionalProperties: additionalProperties + ) } } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift index 11ee77b794..1cc1a01c02 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift @@ -44,11 +44,13 @@ internal struct JSONObject: JSONType { let name: String let comment: String? let properties: [Property] + let additionalProperties: Property? - init(name: String, comment: String?, properties: [Property]) { + init(name: String, comment: String?, properties: [Property], additionalProperties: Property? = nil) { self.name = name self.comment = comment self.properties = properties.sorted { property1, property2 in property1.name < property2.name } + self.additionalProperties = additionalProperties } } diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift index 170d4d3c5b..b4353dab00 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift @@ -74,9 +74,24 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { "enum": ["option1", "option2", "option3", "option4"] }, "readOnly": false + }, + "propertyWithAdditionalProperties": { + "type": "object", + "description": "Description of a property with nested additional properties.", + "additionalProperties": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "readOnly": true } }, - "required": ["property1"] + "additionalProperties": { + "type": "string", + "description": "Additional properties of Foo.", + "readOnly": true + }, + "required": ["property1"], } ] } @@ -140,8 +155,37 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { defaultValue: nil, isRequired: false, isReadOnly: false + ), + JSONObject.Property( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + type: JSONObject( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + properties: [], + additionalProperties: + JSONObject.Property( + name: "additionalProperties", + comment: nil, + type: JSONPrimitive.integer, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) + ), + defaultValue: nil, + isRequired: false, + isReadOnly: true ) - ] + ], + additionalProperties: JSONObject.Property( + name: "additionalProperties", + comment: "Additional properties of Foo.", + type: JSONPrimitive.string, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) ) let jsonSchema = try JSONSchemaReader() From 5cacf26e653b0fae553a7ec9258212ddcbef9df7 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 10:41:39 +0100 Subject: [PATCH 03/36] RUMM-1000 Add additionalProperties to SwiftType and read them in JSONToSwiftTypeTransformer --- .../Swift/JSONToSwiftTypeTransformer.swift | 43 ++++++++----- .../Input/Swift/SwiftType.swift | 1 + .../JSONToSwiftTypeTransformerTests.swift | 63 ++++++++++++++++++- 3 files changed, 92 insertions(+), 15 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index 0e81bee061..138d98f7f8 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -62,24 +62,24 @@ internal class JSONToSwiftTypeTransformer { } private func transformJSONToStruct(_ jsonObject: JSONObject) throws -> SwiftStruct { - /// Reads Struct properties. - func readProperties(from objectProperties: [JSONObject.Property]) throws -> [SwiftStruct.Property] { - /// Reads Struct property default value. - func readDefaultValue(for objectProperty: JSONObject.Property) throws -> SwiftPropertyDefaultValue? { - return objectProperty.defaultValue.ifNotNil { value in - switch value { - case .integer(let intValue): - return intValue - case .string(let stringValue): - if objectProperty.type is JSONEnumeration { - return SwiftEnum.Case(label: stringValue, rawValue: stringValue) - } else { - return stringValue - } + /// Reads Struct property default value. + func readDefaultValue(for objectProperty: JSONObject.Property) throws -> SwiftPropertyDefaultValue? { + return objectProperty.defaultValue.ifNotNil { value in + switch value { + case .integer(let intValue): + return intValue + case .string(let stringValue): + if objectProperty.type is JSONEnumeration { + return SwiftEnum.Case(label: stringValue, rawValue: stringValue) + } else { + return stringValue } } } + } + /// Reads Struct properties. + func readProperties(from objectProperties: [JSONObject.Property]) throws -> [SwiftStruct.Property] { return try objectProperties.map { jsonProperty in return SwiftStruct.Property( name: jsonProperty.name, @@ -93,10 +93,25 @@ internal class JSONToSwiftTypeTransformer { } } + /// Reads Struct properties. + func readAdditionalProperties(from objectAdditionalProperties: JSONObject.Property?) throws -> SwiftStruct.Property? { + guard let additionalProperties = objectAdditionalProperties else { return nil } + return SwiftStruct.Property( + name: additionalProperties.name, + comment: additionalProperties.comment, + type: try transformJSONToAnyType(additionalProperties.type), + isOptional: !additionalProperties.isRequired, + isMutable: !additionalProperties.isReadOnly, + defaultValue: try readDefaultValue(for: additionalProperties), + codingKey: additionalProperties.name + ) + } + return SwiftStruct( name: jsonObject.name, comment: jsonObject.comment, properties: try readProperties(from: jsonObject.properties), + additionalProperties: try readAdditionalProperties(from: jsonObject.additionalProperties), conformance: [] ) } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift index 13cafacc58..1efb0420ca 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift @@ -54,6 +54,7 @@ internal struct SwiftStruct: SwiftType { var name: String var comment: String? var properties: [Property] + var additionalProperties: Property? var conformance: [SwiftProtocol] } diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index 4ee2cdc6bf..9993c4f184 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -67,8 +67,37 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { defaultValue: nil, isRequired: false, isReadOnly: false + ), + JSONObject.Property( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + type: JSONObject( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + properties: [], + additionalProperties: + JSONObject.Property( + name: "additionalProperties", + comment: nil, + type: JSONPrimitive.integer, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) + ), + defaultValue: nil, + isRequired: false, + isReadOnly: true ) - ] + ], + additionalProperties: JSONObject.Property( + name: "additionalProperties", + comment: "Additional properties of Foo.", + type: JSONPrimitive.string, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) ) let expected = SwiftStruct( @@ -147,8 +176,40 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { isMutable: true, defaultValue: nil, codingKey: "property2" + ), + SwiftStruct.Property( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + type: SwiftStruct( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + properties: [], + additionalProperties: SwiftStruct.Property( + name: "additionalProperties", + comment: nil, + type: SwiftPrimitive(), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "additionalProperties" + ), + conformance: [] + ), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "propertyWithAdditionalProperties" ) ], + additionalProperties: SwiftStruct.Property( + name: "additionalProperties", + comment: "Additional properties of Foo.", + type: SwiftPrimitive(), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "additionalProperties" + ), conformance: [] ) From ebd5797d19e90847d350c6aa91559193f30a9086 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 11:36:39 +0100 Subject: [PATCH 04/36] RUMM-1000 Make SwiftStruct.additionalProperties go through the RUM SwiftType transformer --- .../RUM/RUMSwiftTypeTransformer.swift | 3 +++ .../RUM/RUMSwiftTypeTransformerTests.swift | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index 163da85feb..7e09aac61d 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -98,6 +98,9 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { .map { try transform(structProperty: $0) } // TODO: RUMM-1000 should remove this filter .filter { property in property.name != "customTimings" } + if let additionalProperties = `struct`.additionalProperties { + `struct`.additionalProperties = try transform(structProperty: additionalProperties) + } if context.parent == nil { `struct`.conformance = [rumDataModelProtocol] // Conform root structs to `RUMDataModel` } else { diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift index ec6558386b..03f7da04d2 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift @@ -87,6 +87,15 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { codingKey: "property2" ) ], + additionalProperties: SwiftStruct.Property( + name: "additionalProperties", + comment: "Additional properties of FooBar.", + type: SwiftPrimitive(), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "additionalProperties" + ), conformance: [] ) @@ -171,6 +180,15 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { codingKey: "property2" ) ], + additionalProperties: SwiftStruct.Property( + name: "additionalProperties", + comment: "Additional properties of FooBar.", + type: SwiftPrimitive(), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "additionalProperties" + ), conformance: [SwiftProtocol(name: "RUMDataModel", conformance: [codableProtocol])] ) ] From ee0d7df29e4ec97d0dae150fe166d3d21144f18d Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 13:35:17 +0100 Subject: [PATCH 05/36] RUMM-1000 Make SwiftPrinter print SwiftStruct.additionalProperties --- .../Output/Printing/SwiftPrinter.swift | 48 ++++++++++++++----- .../Output/SwiftPrinterTests.swift | 24 ++++++++++ 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index d0e5e9b6d9..7bbf7eb2b6 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -35,6 +35,7 @@ public class SwiftPrinter: BasePrinter { writeLine("public struct \(swiftStruct.name)\(conformance) {") indentRight() try printPropertiesList(swiftStruct.properties) + try printAdditionalProperties(swiftStruct.additionalProperties) if swiftStruct.conforms(to: codableProtocol) { printCodingKeys(for: swiftStruct.properties) } @@ -56,21 +57,11 @@ public class SwiftPrinter: BasePrinter { let name = property.name let type = try typeDeclaration(property.type) let optionality = property.isOptional ? "?" : "" - let defaultValue: String? = try property.defaultValue.ifNotNil { value in - switch value { - case let integerValue as Int: - return " = \(integerValue)" - case let stringValue as String: - return " = \"\(stringValue)\"" - case let enumValue as SwiftEnum.Case: - return " = .\(enumValue.label)" - default: - throw Exception.unimplemented("Failed to print prooperty default value: \(value)") - } - } + let defaultValue = try defaultValueDeclaration(property) + let line = "\(accessLevel) \(kind) \(name): \(type)\(optionality)\(defaultValue ?? "")" printComment(property.comment) - writeLine("\(accessLevel) \(kind) \(name): \(type)\(optionality)\(defaultValue ?? "")") + writeLine(line) if index < properties.count - 1 { writeEmptyLine() @@ -78,6 +69,22 @@ public class SwiftPrinter: BasePrinter { } } + private func printAdditionalProperties(_ additionalProperties: SwiftStruct.Property?) throws { + guard let props = additionalProperties else { return } + + let accessLevel = "public" + let kind = props.isMutable ? "var" : "let" + let type = try typeDeclaration(props.type) + let typeCollection = "[String: \(type)]" + let optionality = props.isOptional ? "?" : "" + let defaultValue = try defaultValueDeclaration(props) + let line = "\(accessLevel) \(kind) \(props.name): \(typeCollection)\(optionality)\(defaultValue ?? "")" + + writeEmptyLine() + printComment(props.comment) + writeLine(line) + } + private func printCodingKeys(for properties: [SwiftStruct.Property]) { writeEmptyLine() writeLine("enum CodingKeys: String, CodingKey {") @@ -145,4 +152,19 @@ public class SwiftPrinter: BasePrinter { throw Exception.unimplemented("Printing \(type) is not implemented.") } } + + private func defaultValueDeclaration(_ property: SwiftStruct.Property) throws -> String? { + try property.defaultValue.ifNotNil { value in + switch value { + case let integerValue as Int: + return " = \(integerValue)" + case let stringValue as String: + return " = \"\(stringValue)\"" + case let enumValue as SwiftEnum.Case: + return " = .\(enumValue.label)" + default: + throw Exception.unimplemented("Failed to print property default value: \(value)") + } + } + } } diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index 3ed9e2f256..b02c025ab1 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -38,6 +38,15 @@ final class SwiftPrinterTests: XCTestCase { codingKey: "property2" ) ], + additionalProperties: SwiftStruct.Property( + name: "additionalProperties", + comment: "Additional properties of Bar.", + type: SwiftPrimitive(), + isOptional: true, + isMutable: true, + defaultValue: nil, + codingKey: "additionalProperties" + ), conformance: [codableProtocol] ), isOptional: true, @@ -86,6 +95,15 @@ final class SwiftPrinterTests: XCTestCase { codingKey: "buzz" ) ], + additionalProperties: SwiftStruct.Property( + name: "additionalProperties", + comment: "Additional properties of FooBar.", + type: SwiftPrimitive(), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "additionalProperties" + ), conformance: [SwiftProtocol(name: "RUMDataModel", conformance: [codableProtocol])] ) @@ -117,6 +135,9 @@ final class SwiftPrinterTests: XCTestCase { /// Description of FooBar's `buzz`. public var buzz: [Buzz]? + /// Additional properties of FooBar. + public let additionalProperties: [String: Int]? + enum CodingKeys: String, CodingKey { case bar = "bar" case bizz = "bizz" @@ -131,6 +152,9 @@ final class SwiftPrinterTests: XCTestCase { /// Description of Bar's `property2`. public var property2: String + /// Additional properties of Bar. + public var additionalProperties: [String: String]? + enum CodingKeys: String, CodingKey { case property1 = "property1" case property2 = "property2" From bd6c2b199bdb44b4b412faa77180253eff466a42 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 13:43:48 +0100 Subject: [PATCH 06/36] RUMM-1000 Change remaining mentions of managedSwift to bridgedSwift --- .../Input/ObjcInterop/ObjcInteropType.swift | 16 ++++++++-------- .../SwiftToObjcInteropTypeTransformer.swift | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift index 7ae271a2c0..a121fe01d0 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift @@ -19,11 +19,11 @@ internal protocol ObjcInteropClass: ObjcInteropType { internal class ObjcInteropRootClass: ObjcInteropClass { /// The `SwiftStruct` managed by this `@objc class`. let bridgedSwiftStruct: SwiftStruct - /// `managedSwiftStruct's` property wrappers exposed to Objc. + /// `bridgedSwiftStruct's` property wrappers exposed to Objc. var objcPropertyWrappers: [ObjcInteropPropertyWrapper] = [] - init(managedSwiftStruct: SwiftStruct) { - self.bridgedSwiftStruct = managedSwiftStruct + init(bridgedSwiftStruct: SwiftStruct) { + self.bridgedSwiftStruct = bridgedSwiftStruct } } @@ -34,12 +34,12 @@ internal class ObjcInteropTransitiveClass: ObjcInteropClass { /// The nested `SwiftStruct` managed by this `@objc class`. let bridgedSwiftStruct: SwiftStruct - /// `managedSwiftStruct's` property wrappers exposed to Objc. + /// `bridgedSwiftStruct's` property wrappers exposed to Objc. var objcPropertyWrappers: [ObjcInteropPropertyWrapper] = [] - init(owner: ObjcInteropPropertyWrapper, managedSwiftStruct: SwiftStruct) { + init(owner: ObjcInteropPropertyWrapper, bridgedSwiftStruct: SwiftStruct) { self.parentProperty = owner - self.bridgedSwiftStruct = managedSwiftStruct + self.bridgedSwiftStruct = bridgedSwiftStruct } } @@ -53,9 +53,9 @@ internal class ObjcInteropEnum: ObjcInteropType { /// The `SwiftEnum` exposed by this Obj-c enum. let bridgedSwiftEnum: SwiftEnum - init(owner: ObjcInteropPropertyWrapper, managedSwiftEnum: SwiftEnum) { + init(owner: ObjcInteropPropertyWrapper, bridgedSwiftEnum: SwiftEnum) { self.parentProperty = owner - self.bridgedSwiftEnum = managedSwiftEnum + self.bridgedSwiftEnum = bridgedSwiftEnum } } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift index 90417fa78e..8e6a5bb595 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift @@ -19,7 +19,7 @@ internal class SwiftToObjcInteropTypeTransformer { try takeRootSwiftStructs(from: swiftTypes) .forEach { rootStruct in - let rootClass = ObjcInteropRootClass(managedSwiftStruct: rootStruct) + let rootClass = ObjcInteropRootClass(bridgedSwiftStruct: rootStruct) outputObjcInteropTypes.append(rootClass) try generateTransitiveObjcInteropTypes(in: rootClass) } @@ -48,7 +48,7 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcNestedClass = ObjcInteropTransitiveClass( owner: propertyWrapper, - managedSwiftStruct: swiftStruct + bridgedSwiftStruct: swiftStruct ) return propertyWrapper case let swiftEnum as SwiftEnum: @@ -58,7 +58,7 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcNestedEnum = ObjcInteropEnum( owner: propertyWrapper, - managedSwiftEnum: swiftEnum + bridgedSwiftEnum: swiftEnum ) return propertyWrapper case let swiftArray as SwiftArray where swiftArray.element is SwiftEnum: @@ -68,7 +68,7 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcNestedEnumsArray = ObjcInteropEnumArray( owner: propertyWrapper, - managedSwiftEnum: swiftArray.element as! SwiftEnum // swiftlint:disable:this force_cast + bridgedSwiftEnum: swiftArray.element as! SwiftEnum // swiftlint:disable:this force_cast ) return propertyWrapper case let swiftArray as SwiftArray where swiftArray.element is SwiftPrimitiveType: @@ -89,7 +89,7 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcNestedClass = ObjcInteropReferencedTransitiveClass( owner: propertyWrapper, - managedSwiftStruct: swiftStruct + bridgedSwiftStruct: swiftStruct ) return propertyWrapper case let swiftEnum as SwiftEnum: @@ -99,7 +99,7 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcNestedEnum = ObjcInteropReferencedEnum( owner: propertyWrapper, - managedSwiftEnum: swiftEnum + bridgedSwiftEnum: swiftEnum ) return propertyWrapper default: From 4b02c71bdd257b8ee3be7441c0c7e2fea2d28c4e Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 14:44:41 +0100 Subject: [PATCH 07/36] RUMM-1000 Handle PropertyWrappers for SwiftStruct additionalProperties in Objc Interop --- .../Input/ObjcInterop/ObjcInteropType.swift | 5 + .../SwiftToObjcInteropTypeTransformer.swift | 170 +++++++++--------- .../Output/Printing/ObjcInteropPrinter.swift | 12 +- .../Output/ObjcInteropPrinterTests.swift | 77 ++++++++ 4 files changed, 183 insertions(+), 81 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift index a121fe01d0..7c04dff2a8 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift @@ -13,6 +13,7 @@ internal protocol ObjcInteropType: AnyObject {} internal protocol ObjcInteropClass: ObjcInteropType { var bridgedSwiftStruct: SwiftStruct { get } var objcPropertyWrappers: [ObjcInteropPropertyWrapper] { set get } + var objcAdditionalPropertiesWrapper: ObjcInteropPropertyWrapper? { set get } } /// Schema of a root `@objc class` storing the mutable value of a `SwiftStruct`. @@ -21,6 +22,8 @@ internal class ObjcInteropRootClass: ObjcInteropClass { let bridgedSwiftStruct: SwiftStruct /// `bridgedSwiftStruct's` property wrappers exposed to Objc. var objcPropertyWrappers: [ObjcInteropPropertyWrapper] = [] + /// `bridgedSwiftStruct's` additionalProperties property wrapper exposed to Objc. + var objcAdditionalPropertiesWrapper: ObjcInteropPropertyWrapper? init(bridgedSwiftStruct: SwiftStruct) { self.bridgedSwiftStruct = bridgedSwiftStruct @@ -36,6 +39,8 @@ internal class ObjcInteropTransitiveClass: ObjcInteropClass { let bridgedSwiftStruct: SwiftStruct /// `bridgedSwiftStruct's` property wrappers exposed to Objc. var objcPropertyWrappers: [ObjcInteropPropertyWrapper] = [] + /// `bridgedSwiftStruct's` additionalProperties property wrapper exposed to Objc. + var objcAdditionalPropertiesWrapper: ObjcInteropPropertyWrapper? init(owner: ObjcInteropPropertyWrapper, bridgedSwiftStruct: SwiftStruct) { self.parentProperty = owner diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift index 8e6a5bb595..a911f2af21 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift @@ -32,87 +32,17 @@ internal class SwiftToObjcInteropTypeTransformer { private func generateTransitiveObjcInteropTypes(in objcClass: ObjcInteropClass) throws { // Generate property wrappers objcClass.objcPropertyWrappers = try objcClass.bridgedSwiftStruct.properties - .map { swiftProperty in - switch swiftProperty.type { - case let swiftPrimitive as SwiftPrimitiveType: - let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcInteropType = try objcInteropType(for: swiftPrimitive) - return propertyWrapper - case let swiftStruct as SwiftStruct: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedClass = ObjcInteropTransitiveClass( - owner: propertyWrapper, - bridgedSwiftStruct: swiftStruct - ) - return propertyWrapper - case let swiftEnum as SwiftEnum: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedEnum = ObjcInteropEnum( - owner: propertyWrapper, - bridgedSwiftEnum: swiftEnum - ) - return propertyWrapper - case let swiftArray as SwiftArray where swiftArray.element is SwiftEnum: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnumsArray( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedEnumsArray = ObjcInteropEnumArray( - owner: propertyWrapper, - bridgedSwiftEnum: swiftArray.element as! SwiftEnum // swiftlint:disable:this force_cast - ) - return propertyWrapper - case let swiftArray as SwiftArray where swiftArray.element is SwiftPrimitiveType: - let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcInteropType = try objcInteropType(for: swiftArray) - return propertyWrapper - case let swifTypeReference as SwiftTypeReference: - let referencedType = try resolve(swiftTypeReference: swifTypeReference) - - switch referencedType { - case let swiftStruct as SwiftStruct: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedClass = ObjcInteropReferencedTransitiveClass( - owner: propertyWrapper, - bridgedSwiftStruct: swiftStruct - ) - return propertyWrapper - case let swiftEnum as SwiftEnum: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedEnum = ObjcInteropReferencedEnum( - owner: propertyWrapper, - bridgedSwiftEnum: swiftEnum - ) - return propertyWrapper - default: - throw Exception.illegal("Illegal reference type: \(swifTypeReference)") - } - default: - throw Exception.unimplemented( - "Cannot generate @objc property wrapper for: \(type(of: swiftProperty.type))" - ) - } - } + .map { try objcInteropPropertyWrapper(for: $0, in: objcClass) } + if let additionalProperties = objcClass.bridgedSwiftStruct.additionalProperties { + objcClass.objcAdditionalPropertiesWrapper = try objcInteropPropertyWrapper(for: additionalProperties, in: objcClass) + } + + var allPropertyWrappers = objcClass.objcPropertyWrappers + if let additionalPropertiesWrapper = objcClass.objcAdditionalPropertiesWrapper { + allPropertyWrappers.append(additionalPropertiesWrapper) + } - try objcClass.objcPropertyWrappers + try allPropertyWrappers .compactMap { $0 as? ObjcInteropPropertyWrapperForTransitiveType } .forEach { propertyWrapper in // Store `ObjcInteropTypes` created for property wrappers @@ -142,6 +72,86 @@ internal class SwiftToObjcInteropTypeTransformer { } } + private func objcInteropPropertyWrapper(for swiftProperty: SwiftStruct.Property, in objcClass: ObjcInteropClass) throws -> ObjcInteropPropertyWrapper { + switch swiftProperty.type { + case let swiftPrimitive as SwiftPrimitiveType: + let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcInteropType = try objcInteropType(for: swiftPrimitive) + return propertyWrapper + case let swiftStruct as SwiftStruct: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedClass = ObjcInteropTransitiveClass( + owner: propertyWrapper, + bridgedSwiftStruct: swiftStruct + ) + return propertyWrapper + case let swiftEnum as SwiftEnum: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedEnum = ObjcInteropEnum( + owner: propertyWrapper, + bridgedSwiftEnum: swiftEnum + ) + return propertyWrapper + case let swiftArray as SwiftArray where swiftArray.element is SwiftEnum: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnumsArray( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedEnumsArray = ObjcInteropEnumArray( + owner: propertyWrapper, + bridgedSwiftEnum: swiftArray.element as! SwiftEnum // swiftlint:disable:this force_cast + ) + return propertyWrapper + case let swiftArray as SwiftArray where swiftArray.element is SwiftPrimitiveType: + let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcInteropType = try objcInteropType(for: swiftArray) + return propertyWrapper + case let swifTypeReference as SwiftTypeReference: + let referencedType = try resolve(swiftTypeReference: swifTypeReference) + + switch referencedType { + case let swiftStruct as SwiftStruct: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedClass = ObjcInteropReferencedTransitiveClass( + owner: propertyWrapper, + bridgedSwiftStruct: swiftStruct + ) + return propertyWrapper + case let swiftEnum as SwiftEnum: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedEnum = ObjcInteropReferencedEnum( + owner: propertyWrapper, + bridgedSwiftEnum: swiftEnum + ) + return propertyWrapper + default: + throw Exception.illegal("Illegal reference type: \(swifTypeReference)") + } + default: + throw Exception.unimplemented( + "Cannot generate @objc property wrapper for: \(type(of: swiftProperty.type))" + ) + } + } + // MARK: - Helpers /// Filters out given `SwiftTypes` by removing all types referenced using `SwiftReferenceType`. diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift index b958f1f118..8a69ba87e0 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift @@ -81,6 +81,9 @@ internal class ObjcInteropPrinter: BasePrinter { try objcInteropRootClass.objcPropertyWrappers.forEach { propertyWrapper in try print(objcInteropPropertyWrapper: propertyWrapper) } + if let additionalPropertiesWrapper = objcInteropRootClass.objcAdditionalPropertiesWrapper { + try print(objcInteropPropertyWrapper: additionalPropertiesWrapper) + } indentLeft() writeLine("}") } @@ -102,6 +105,9 @@ internal class ObjcInteropPrinter: BasePrinter { try objcInteropNestedClass.objcPropertyWrappers.forEach { propertyWrapper in try print(objcInteropPropertyWrapper: propertyWrapper) } + if let additionalPropertiesWrapper = objcInteropNestedClass.objcAdditionalPropertiesWrapper { + try print(objcInteropPropertyWrapper: additionalPropertiesWrapper) + } indentLeft() writeLine("}") } @@ -263,7 +269,11 @@ internal class ObjcInteropPrinter: BasePrinter { let swiftProperty = propertyWrapper.bridgedSwiftProperty let objcPropertyName = swiftProperty.name let objcPropertyOptionality = swiftProperty.isOptional ? "?" : "" - let objcTypeName = try objcInteropTypeName(for: propertyWrapper.objcInteropType) + var objcTypeName = try objcInteropTypeName(for: propertyWrapper.objcInteropType) + // TODO: RUMM-1000 Add support for Dictionary upstream instead of dealing with it at print time. + if objcPropertyName == "additionalProperties" { + objcTypeName = "[String: " + objcTypeName + "]" + } let asObjcCast = try swiftToObjcCast(for: propertyWrapper.objcInteropType).ifNotNil { asObjcCast in asObjcCast + objcPropertyOptionality } ?? "" diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift index 1d75608ca5..26a5ba5ba0 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift @@ -1294,6 +1294,83 @@ final class ObjcInteropPrinterTests: XCTestCase { XCTAssertEqual(expected, actual) } + // MARK: - Property wrappers for additional properties in Swift Structs + + func testPrintingObjcInteropForSwiftStructsWithAdditionalProperties() throws { + let fooStruct = SwiftStruct( + name: "Foo", + comment: nil, + properties: [ + .mock( + propertyName: "bar", + type: SwiftStruct( + name: "Bar", + comment: nil, + properties: [], + conformance: [] + ), + isOptional: false, + isMutable: true + ) + ], + additionalProperties: .mock( + propertyName: "additionalProperties", + type: SwiftPrimitive(), + isOptional: true, + isMutable: true + ), + conformance: [] + ) + + let expected = """ + // MARK: - Swift + + public struct Foo { + public var bar: Bar + + public var additionalProperties: [String: String]? + + public struct Bar { + } + } + + // MARK: - ObjcInterop + + @objc + public class DDFoo: NSObject { + internal var swiftModel: Foo + internal var root: DDFoo { self } + + internal init(swiftModel: Foo) { + self.swiftModel = swiftModel + } + + @objc public var bar: DDFooBar { + DDFooBar(root: root) + } + + @objc public var additionalProperties: [String: String]? { + set { root.swiftModel.additionalProperties = newValue } + get { root.swiftModel.additionalProperties } + } + } + + @objc + public class DDFooBar: NSObject { + internal let root: DDFoo + + internal init(root: DDFoo) { + self.root = root + } + } + + """ + + let actual = try printSwiftWithObjcInterop(for: [fooStruct]) + + XCTAssertEqual(expected, actual) + } + // MARK: - Referenced Swift Structs and Enums func testPrintingObjcInteropForSwiftStructsWithReferencedStructAndEnum() throws { From 865c8818ee85abfe75f919f37fd318b96157f036 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 20:33:47 +0100 Subject: [PATCH 08/36] RUMM-1000 Generate Codable methods in SwiftPrinter for Structs with additionalProperties --- .../Output/Printing/BasePrinter.swift | 6 ++ .../Output/Printing/SwiftPrinter.swift | 68 +++++++++++++++++++ .../Output/SwiftPrinterTests.swift | 58 ++++++++++++++++ 3 files changed, 132 insertions(+) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift index c6b8375d83..9e2c2b8d9b 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift @@ -36,6 +36,12 @@ public class BasePrinter { output += "\n" } + func indent(_ codeBlock: () throws -> Void) throws { + indentRight() + try codeBlock() + indentLeft() + } + func indentRight() { indentationLevel += 1 } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index 7bbf7eb2b6..81b3af6c7f 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -11,6 +11,9 @@ public class SwiftPrinter: BasePrinter { public func print(swiftTypes: [SwiftType]) throws -> String { reset() + writeEmptyLine() + printDynamicCodingKeys() + try swiftTypes.forEach { type in writeEmptyLine() if let `struct` = type as? SwiftStruct { @@ -27,6 +30,19 @@ public class SwiftPrinter: BasePrinter { // MARK: - Private + private func printDynamicCodingKeys() { + let code = """ + fileprivate struct DynamicCodingKey: CodingKey { + var stringValue: String + var intValue: Int? + init?(stringValue: String) { self.stringValue = stringValue } + init?(intValue: Int) { return nil } + init(_ string: String) { self.stringValue = string } + } + """ + writeLine(code) + } + private func printStruct(_ swiftStruct: SwiftStruct) throws { let implementedProtocols = swiftStruct.conformance.map { $0.name } let conformance = implementedProtocols.isEmpty ? "" : ": \(implementedProtocols.joined(separator: ", "))" @@ -38,6 +54,12 @@ public class SwiftPrinter: BasePrinter { try printAdditionalProperties(swiftStruct.additionalProperties) if swiftStruct.conforms(to: codableProtocol) { printCodingKeys(for: swiftStruct.properties) + if let additionalProperties = swiftStruct.additionalProperties { + try printCodableMethods( + for: swiftStruct.properties, + additionalProperties: additionalProperties + ) + } } try printNestedTypes(in: swiftStruct) indentLeft() @@ -96,6 +118,52 @@ public class SwiftPrinter: BasePrinter { writeLine("}") } + private func printCodableMethods(for properties: [SwiftStruct.Property], additionalProperties: SwiftStruct.Property) throws { + writeEmptyLine() + writeLine("func encode(to encoder: Encoder) throws {") + try indent { + if properties.count > 0 { + writeLine("var propsContainer = encoder.container(keyedBy: CodingKeys.self)") + properties.forEach { property in + writeLine("try propsContainer.encode(\(property.name), forKey: .\(property.codingKey))") + } + writeEmptyLine() + } + + writeLine("var addPropsContainer = encoder.container(keyedBy: DynamicCodingKey.self)") + writeLine("try additionalProperties.forEach { key, value in") + try indent { + writeLine("try addPropsContainer.encode(value, forKey: DynamicCodingKey(key))") + } + writeLine("}") + } + writeLine("}") + + writeEmptyLine() + writeLine("init(from decoder: Decoder) throws {") + try indent { + if properties.count > 0 { + writeLine("var propsContainer = decoder.container(keyedBy: CodingKeys.self)") + try properties.forEach { property in + let typeName = try typeDeclaration(property.type) + writeLine("\(property.name) = try propsContainer.decode(\(typeName).self, forKey: .\(property.codingKey))") + } + writeEmptyLine() + } + + let typeName = try typeDeclaration(additionalProperties.type) + writeLine("var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self)") + writeLine("let allKeys = addPropsContainer.allKeys") + writeLine("try allKeys.forEach { key in") + try indent { + writeLine("let value = try addPropsContainer.decode(\(typeName).self, forKey: key)") + writeLine("additionalProperties[key] = value") + } + writeLine("}") + } + writeLine("}") + } + private func printNestedTypes(in swiftStruct: SwiftStruct) throws { let nestedTypes = swiftStruct.properties.map { $0.type } try nestedTypes.forEach { type in diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index b02c025ab1..0d9a7beb5c 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -124,6 +124,14 @@ final class SwiftPrinterTests: XCTestCase { let expected = """ + fileprivate struct DynamicCodingKey: CodingKey { + var stringValue: String + var intValue: Int? + init?(stringValue: String) { self.stringValue = stringValue } + init?(intValue: Int) { return nil } + init(_ string: String) { self.stringValue = string } + } + /// Description of FooBar. public struct FooBar: RUMDataModel { /// Description of Bar. @@ -144,6 +152,32 @@ final class SwiftPrinterTests: XCTestCase { case buzz = "buzz" } + func encode(to encoder: Encoder) throws { + var propsContainer = encoder.container(keyedBy: CodingKeys.self) + try propsContainer.encode(bar, forKey: .bar) + try propsContainer.encode(bizz, forKey: .bizz) + try propsContainer.encode(buzz, forKey: .buzz) + + var addPropsContainer = encoder.container(keyedBy: DynamicCodingKey.self) + try additionalProperties.forEach { key, value in + try addPropsContainer.encode(value, forKey: DynamicCodingKey(key)) + } + } + + init(from decoder: Decoder) throws { + var propsContainer = decoder.container(keyedBy: CodingKeys.self) + bar = try propsContainer.decode(BAR.self, forKey: .bar) + bizz = try propsContainer.decode(Bizz.self, forKey: .bizz) + buzz = try propsContainer.decode([Buzz].self, forKey: .buzz) + + var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self) + let allKeys = addPropsContainer.allKeys + try allKeys.forEach { key in + let value = try addPropsContainer.decode(Int.self, forKey: key) + additionalProperties[key] = value + } + } + /// Description of Bar. public struct BAR: Codable { /// Description of Bar's `property1`. @@ -159,6 +193,30 @@ final class SwiftPrinterTests: XCTestCase { case property1 = "property1" case property2 = "property2" } + + func encode(to encoder: Encoder) throws { + var propsContainer = encoder.container(keyedBy: CodingKeys.self) + try propsContainer.encode(property1, forKey: .property1) + try propsContainer.encode(property2, forKey: .property2) + + var addPropsContainer = encoder.container(keyedBy: DynamicCodingKey.self) + try additionalProperties.forEach { key, value in + try addPropsContainer.encode(value, forKey: DynamicCodingKey(key)) + } + } + + init(from decoder: Decoder) throws { + var propsContainer = decoder.container(keyedBy: CodingKeys.self) + property1 = try propsContainer.decode(String.self, forKey: .property1) + property2 = try propsContainer.decode(String.self, forKey: .property2) + + var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self) + let allKeys = addPropsContainer.allKeys + try allKeys.forEach { key in + let value = try addPropsContainer.decode(String.self, forKey: key) + additionalProperties[key] = value + } + } } /// Description of FooBar's `bizz`. From d6e7c67319351865180cfc33444e64c79bbe3686 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 21:32:59 +0100 Subject: [PATCH 09/36] RUMM-1000 Add basic support of Dictionary as SwiftType/ObjcInteropType and use it for additionalProperties --- .../Input/ObjcInterop/ObjcInteropType.swift | 10 ++++++ .../SwiftToObjcInteropTypeTransformer.swift | 10 ++++++ .../Swift/JSONToSwiftTypeTransformer.swift | 5 ++- .../Input/Swift/SwiftType.swift | 5 +++ .../Output/Printing/ObjcInteropPrinter.swift | 18 +++++++--- .../Output/Printing/SwiftPrinter.swift | 35 +++++++++++-------- .../RUM/RUMSwiftTypeTransformer.swift | 8 +++++ .../JSONToSwiftTypeTransformerTests.swift | 4 +-- .../Output/ObjcInteropPrinterTests.swift | 4 +-- .../Output/SwiftPrinterTests.swift | 4 +-- 10 files changed, 76 insertions(+), 27 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift index 7c04dff2a8..c0f5472170 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift @@ -138,3 +138,13 @@ internal class ObjcInteropNSArray: ObjcInteropType { self.element = element } } + +internal class ObjcInteropNSDictionary: ObjcInteropType { + let key: ObjcInteropType + let value: ObjcInteropType + + init(key: ObjcInteropType, value: ObjcInteropType) { + self.key = key + self.value = value + } +} diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift index a911f2af21..67744c6313 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift @@ -65,6 +65,9 @@ internal class SwiftToObjcInteropTypeTransformer { return ObjcInteropNSString(swiftString: swiftString) case let swiftArray as SwiftArray: return ObjcInteropNSArray(element: try objcInteropType(for: swiftArray.element)) + case let swiftDictionary as SwiftDictionary: + return ObjcInteropNSDictionary(key: try objcInteropType(for: swiftDictionary.key), + value: try objcInteropType(for: swiftDictionary.value)) default: throw Exception.unimplemented( "Cannot create `ObjcInteropType` type for \(type(of: swiftType))." @@ -118,6 +121,13 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcInteropType = try objcInteropType(for: swiftArray) return propertyWrapper + case let swiftDictionary as SwiftDictionary where swiftDictionary.value is SwiftPrimitiveType: + let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcInteropType = try objcInteropType(for: swiftDictionary) + return propertyWrapper case let swifTypeReference as SwiftTypeReference: let referencedType = try resolve(swiftTypeReference: swifTypeReference) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index 138d98f7f8..fbf4bde088 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -96,10 +96,13 @@ internal class JSONToSwiftTypeTransformer { /// Reads Struct properties. func readAdditionalProperties(from objectAdditionalProperties: JSONObject.Property?) throws -> SwiftStruct.Property? { guard let additionalProperties = objectAdditionalProperties else { return nil } + let type = SwiftDictionary(key: SwiftPrimitive(), value: + try transformJSONToAnyType(additionalProperties.type) + ) return SwiftStruct.Property( name: additionalProperties.name, comment: additionalProperties.comment, - type: try transformJSONToAnyType(additionalProperties.type), + type: type, isOptional: !additionalProperties.isRequired, isMutable: !additionalProperties.isReadOnly, defaultValue: try readDefaultValue(for: additionalProperties), diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift index 1efb0420ca..4a48f9e49b 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift @@ -28,6 +28,11 @@ internal struct SwiftArray: SwiftType { var element: SwiftType } +internal struct SwiftDictionary: SwiftType { + var key: SwiftType + var value: SwiftType +} + internal struct SwiftEnum: SwiftType { struct Case: SwiftType, SwiftPropertyDefaultValue { var label: String diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift index 8a69ba87e0..2329b1af2e 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift @@ -269,11 +269,7 @@ internal class ObjcInteropPrinter: BasePrinter { let swiftProperty = propertyWrapper.bridgedSwiftProperty let objcPropertyName = swiftProperty.name let objcPropertyOptionality = swiftProperty.isOptional ? "?" : "" - var objcTypeName = try objcInteropTypeName(for: propertyWrapper.objcInteropType) - // TODO: RUMM-1000 Add support for Dictionary upstream instead of dealing with it at print time. - if objcPropertyName == "additionalProperties" { - objcTypeName = "[String: " + objcTypeName + "]" - } + let objcTypeName = try objcInteropTypeName(for: propertyWrapper.objcInteropType) let asObjcCast = try swiftToObjcCast(for: propertyWrapper.objcInteropType).ifNotNil { asObjcCast in asObjcCast + objcPropertyOptionality } ?? "" @@ -320,6 +316,8 @@ internal class ObjcInteropPrinter: BasePrinter { return "String" case let objcArray as ObjcInteropNSArray: return "[\(try objcInteropTypeName(for: objcArray.element))]" + case let objcDictionary as ObjcInteropNSDictionary: + return "[\(try objcInteropTypeName(for: objcDictionary.key)): \(try objcInteropTypeName(for: objcDictionary.value))]" default: throw Exception.unimplemented( "Cannot print `ObjcInteropType` name for \(type(of: objcType))." @@ -333,10 +331,14 @@ internal class ObjcInteropPrinter: BasePrinter { return " as NSNumber" case let nsArray as ObjcInteropNSArray where nsArray.element is ObjcInteropNSNumber: return " as [NSNumber]" + case let nsDictionary as ObjcInteropNSDictionary where nsDictionary.value is ObjcInteropNSNumber: + return " as [\(try objcInteropTypeName(for: nsDictionary.key)): NSNumber]" case _ as ObjcInteropNSString: return nil // `String` <> `NSString` interoperability doesn't require casting case let nsArray as ObjcInteropNSArray where nsArray.element is ObjcInteropNSString: return nil // `[String]` <> `[NSString]` interoperability doesn't require casting + case let nsDictionary as ObjcInteropNSDictionary where nsDictionary.value is ObjcInteropNSString: + return nil // `[Key: String]` <> `[Key: NSString]` interoperability doesn't require casting default: throw Exception.unimplemented("Cannot print `swiftToObjcCast()` for \(type(of: objcType)).") } @@ -354,10 +356,16 @@ internal class ObjcInteropPrinter: BasePrinter { return ".int64Value" case let swiftArray as SwiftArray where swiftArray.element is SwiftPrimitive: return nil // `[String]` <> `[NSString]` interoperability doesn't require casting + case let swiftDictionary as SwiftDictionary where swiftDictionary.value is SwiftPrimitive: + return nil // `[Key: String]` <> `[Key: NSString]` interoperability doesn't require casting case let swiftArray as SwiftArray: let elementCast = try objcToSwiftCast(for: swiftArray.element) .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftArray` with elements of type: \(type(of: swiftArray.element))")) return ".map { $0\(elementCast) }" + case let swiftDictionary as SwiftDictionary: + let valueCast = try objcToSwiftCast(for: swiftDictionary.value) + .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftDictionary` with values of type: \(type(of: swiftDictionary.value))")) + return ".map { $0\(valueCast) }" case _ as SwiftPrimitive: return nil // `String` <> `NSString` interoperability doesn't require casting default: diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index 81b3af6c7f..f2544a4942 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -8,11 +8,13 @@ import Foundation /// Generates Swift code from `SwiftTypes`. public class SwiftPrinter: BasePrinter { - public func print(swiftTypes: [SwiftType]) throws -> String { + public func print(swiftTypes: [SwiftType], includeDynamicCodingKeys: Bool = true) throws -> String { reset() - writeEmptyLine() - printDynamicCodingKeys() + if includeDynamicCodingKeys { + writeEmptyLine() + printDynamicCodingKeys() + } try swiftTypes.forEach { type in writeEmptyLine() @@ -97,10 +99,9 @@ public class SwiftPrinter: BasePrinter { let accessLevel = "public" let kind = props.isMutable ? "var" : "let" let type = try typeDeclaration(props.type) - let typeCollection = "[String: \(type)]" let optionality = props.isOptional ? "?" : "" let defaultValue = try defaultValueDeclaration(props) - let line = "\(accessLevel) \(kind) \(props.name): \(typeCollection)\(optionality)\(defaultValue ?? "")" + let line = "\(accessLevel) \(kind) \(props.name): \(type)\(optionality)\(defaultValue ?? "")" writeEmptyLine() printComment(props.comment) @@ -151,15 +152,17 @@ public class SwiftPrinter: BasePrinter { writeEmptyLine() } - let typeName = try typeDeclaration(additionalProperties.type) - writeLine("var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self)") - writeLine("let allKeys = addPropsContainer.allKeys") - writeLine("try allKeys.forEach { key in") - try indent { - writeLine("let value = try addPropsContainer.decode(\(typeName).self, forKey: key)") - writeLine("additionalProperties[key] = value") + if let dictionary = additionalProperties.type as? SwiftDictionary { + let typeName = try typeDeclaration(dictionary.value) + writeLine("var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self)") + writeLine("let allKeys = addPropsContainer.allKeys") + writeLine("try allKeys.forEach { key in") + try indent { + writeLine("let value = try addPropsContainer.decode(\(typeName).self, forKey: key)") + writeLine("additionalProperties[key] = value") + } + writeLine("}") } - writeLine("}") } writeLine("}") } @@ -167,8 +170,8 @@ public class SwiftPrinter: BasePrinter { private func printNestedTypes(in swiftStruct: SwiftStruct) throws { let nestedTypes = swiftStruct.properties.map { $0.type } try nestedTypes.forEach { type in - let nestedStruct = (type as? SwiftStruct) ?? ((type as? SwiftArray)?.element as? SwiftStruct) - let nestedEnum = (type as? SwiftEnum) ?? ((type as? SwiftArray)?.element as? SwiftEnum) + let nestedStruct = (type as? SwiftStruct) ?? ((type as? SwiftArray)?.element as? SwiftStruct) ?? ((type as? SwiftDictionary)?.value as? SwiftStruct) + let nestedEnum = (type as? SwiftEnum) ?? ((type as? SwiftArray)?.element as? SwiftEnum) ?? ((type as? SwiftDictionary)?.value as? SwiftEnum) if let nestedStruct = nestedStruct { writeEmptyLine() @@ -210,6 +213,8 @@ public class SwiftPrinter: BasePrinter { return "String" case let swiftArray as SwiftArray: return "[\(try typeDeclaration(swiftArray.element))]" + case let swiftDictionary as SwiftDictionary: + return "[\(try typeDeclaration(swiftDictionary.key)): \(try typeDeclaration(swiftDictionary.value))]" case let swiftEnum as SwiftEnum: return swiftEnum.name case let swiftStruct as SwiftStruct: diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index 7e09aac61d..ffd5345d28 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -35,6 +35,8 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { return transform(primitive: primitive) case let array as SwiftArray: return try transform(array: array) + case let dictionary as SwiftDictionary: + return try transform(dictionary: dictionary) case let `enum` as SwiftEnum: let transformed = transform(enum: `enum`) return isSharedType(transformed) ? try replaceWithSharedTypeReference(transformed) : transformed @@ -54,6 +56,12 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { } } + private func transform(dictionary: SwiftDictionary) throws -> SwiftDictionary { + var dictionary = dictionary + dictionary.value = try transformAny(type: dictionary.value) + return dictionary + } + private func transform(array: SwiftArray) throws -> SwiftArray { var array = array array.element = try transformAny(type: array.element) diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index 9993c4f184..fcfca6f51d 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -187,7 +187,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: nil, - type: SwiftPrimitive(), + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, @@ -204,7 +204,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: "Additional properties of Foo.", - type: SwiftPrimitive(), + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift index 26a5ba5ba0..a66b40519b 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift @@ -18,7 +18,7 @@ final class ObjcInteropPrinterTests: XCTestCase { return """ // MARK: - Swift - \(try swiftPrinter.print(swiftTypes: swiftTypes)) + \(try swiftPrinter.print(swiftTypes: swiftTypes, includeDynamicCodingKeys: false)) // MARK: - ObjcInterop \(try objcInteropPrinter.print(objcInteropTypes: objcInteropTypes)) """ @@ -1315,7 +1315,7 @@ final class ObjcInteropPrinterTests: XCTestCase { ], additionalProperties: .mock( propertyName: "additionalProperties", - type: SwiftPrimitive(), + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), isOptional: true, isMutable: true ), diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index 0d9a7beb5c..368c9e08d5 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -41,7 +41,7 @@ final class SwiftPrinterTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: "Additional properties of Bar.", - type: SwiftPrimitive(), + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), isOptional: true, isMutable: true, defaultValue: nil, @@ -98,7 +98,7 @@ final class SwiftPrinterTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: "Additional properties of FooBar.", - type: SwiftPrimitive(), + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, From 7c60dcd55fba4816534965a1bc819dbe2ef22ccf Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Wed, 3 Feb 2021 21:38:03 +0100 Subject: [PATCH 10/36] RUMM-1000 Remove exclusion of customTimings in RUMSwiftTypeTransformer after adding support for additionalProperties --- .../RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index ffd5345d28..3ef68287fc 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -104,8 +104,6 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { `struct`.name = format(structName: `struct`.name) `struct`.properties = try `struct`.properties .map { try transform(structProperty: $0) } - // TODO: RUMM-1000 should remove this filter - .filter { property in property.name != "customTimings" } if let additionalProperties = `struct`.additionalProperties { `struct`.additionalProperties = try transform(structProperty: additionalProperties) } From efe10d9f5e7670037c6adb593cb3f427f5aa2109 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Thu, 4 Feb 2021 10:22:30 +0100 Subject: [PATCH 11/36] RUMM-1000 Move mapping from Property to Dictionary of Properties for additional properties to a later stage in RUMSwiftTypeTransformer --- .../Input/Swift/JSONToSwiftTypeTransformer.swift | 5 +---- .../RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift | 5 ++++- .../Input/JSONToSwiftTypeTransformerTests.swift | 4 ++-- .../RUM/RUMSwiftTypeTransformerTests.swift | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index fbf4bde088..138d98f7f8 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -96,13 +96,10 @@ internal class JSONToSwiftTypeTransformer { /// Reads Struct properties. func readAdditionalProperties(from objectAdditionalProperties: JSONObject.Property?) throws -> SwiftStruct.Property? { guard let additionalProperties = objectAdditionalProperties else { return nil } - let type = SwiftDictionary(key: SwiftPrimitive(), value: - try transformJSONToAnyType(additionalProperties.type) - ) return SwiftStruct.Property( name: additionalProperties.name, comment: additionalProperties.comment, - type: type, + type: try transformJSONToAnyType(additionalProperties.type), isOptional: !additionalProperties.isRequired, isMutable: !additionalProperties.isReadOnly, defaultValue: try readDefaultValue(for: additionalProperties), diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index 3ef68287fc..d39a4efc77 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -104,7 +104,10 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { `struct`.name = format(structName: `struct`.name) `struct`.properties = try `struct`.properties .map { try transform(structProperty: $0) } - if let additionalProperties = `struct`.additionalProperties { + if var additionalProperties = `struct`.additionalProperties { + // Store additional/runtime declared properties in a Dictionary indexed by their names: + additionalProperties.type = SwiftDictionary(key: SwiftPrimitive(), + value: additionalProperties.type) `struct`.additionalProperties = try transform(structProperty: additionalProperties) } if context.parent == nil { diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index fcfca6f51d..9993c4f184 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -187,7 +187,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: nil, - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftPrimitive(), isOptional: true, isMutable: false, defaultValue: nil, @@ -204,7 +204,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: "Additional properties of Foo.", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftPrimitive(), isOptional: true, isMutable: false, defaultValue: nil, diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift index 03f7da04d2..194ea44701 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift @@ -183,7 +183,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { additionalProperties: SwiftStruct.Property( name: "additionalProperties", comment: "Additional properties of FooBar.", - type: SwiftPrimitive(), + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, From f3bbb6d996ae46c5bd2cc373eac8498da570f08e Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Thu, 4 Feb 2021 10:43:26 +0100 Subject: [PATCH 12/36] RUMM-1000 Add comments and factor some functions --- .../Swift/JSONToSwiftTypeTransformer.swift | 42 ++++++----- .../Output/Printing/SwiftPrinter.swift | 70 +++++++++---------- 2 files changed, 52 insertions(+), 60 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index 138d98f7f8..e4386ea265 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -78,33 +78,31 @@ internal class JSONToSwiftTypeTransformer { } } + func property(from objectProperty: JSONObject.Property) throws -> SwiftStruct.Property { + return SwiftStruct.Property( + name: objectProperty.name, + comment: objectProperty.comment, + type: try transformJSONToAnyType(objectProperty.type), + isOptional: !objectProperty.isRequired, + isMutable: !objectProperty.isReadOnly, + defaultValue: try readDefaultValue(for: objectProperty), + codingKey: objectProperty.name + ) + } + /// Reads Struct properties. func readProperties(from objectProperties: [JSONObject.Property]) throws -> [SwiftStruct.Property] { - return try objectProperties.map { jsonProperty in - return SwiftStruct.Property( - name: jsonProperty.name, - comment: jsonProperty.comment, - type: try transformJSONToAnyType(jsonProperty.type), - isOptional: !jsonProperty.isRequired, - isMutable: !jsonProperty.isReadOnly, - defaultValue: try readDefaultValue(for: jsonProperty), - codingKey: jsonProperty.name - ) - } + return try objectProperties.map { try property(from: $0) } } - /// Reads Struct properties. + /// Reads Struct additional properties. func readAdditionalProperties(from objectAdditionalProperties: JSONObject.Property?) throws -> SwiftStruct.Property? { - guard let additionalProperties = objectAdditionalProperties else { return nil } - return SwiftStruct.Property( - name: additionalProperties.name, - comment: additionalProperties.comment, - type: try transformJSONToAnyType(additionalProperties.type), - isOptional: !additionalProperties.isRequired, - isMutable: !additionalProperties.isReadOnly, - defaultValue: try readDefaultValue(for: additionalProperties), - codingKey: additionalProperties.name - ) + if let additionalProperties = objectAdditionalProperties { + return try property(from: additionalProperties) + } + else { + return nil + } } return SwiftStruct( diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index f2544a4942..cf352f0bd3 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -33,6 +33,7 @@ public class SwiftPrinter: BasePrinter { // MARK: - Private private func printDynamicCodingKeys() { + // DynamicCodingKey is used to wrap String based keys of additional properties. let code = """ fileprivate struct DynamicCodingKey: CodingKey { var stringValue: String @@ -57,6 +58,8 @@ public class SwiftPrinter: BasePrinter { if swiftStruct.conforms(to: codableProtocol) { printCodingKeys(for: swiftStruct.properties) if let additionalProperties = swiftStruct.additionalProperties { + // Additional properties need to be flattened up at the root level, instead of being under a dedicated key. + // Thus the need for some ad hoc encode/decode implementation of *all* properties. try printCodableMethods( for: swiftStruct.properties, additionalProperties: additionalProperties @@ -74,19 +77,33 @@ public class SwiftPrinter: BasePrinter { } } - private func printPropertiesList(_ properties: [SwiftStruct.Property]) throws { - try properties.enumerated().forEach { index, property in - let accessLevel = "public" - let kind = property.isMutable ? "var" : "let" - let name = property.name - let type = try typeDeclaration(property.type) - let optionality = property.isOptional ? "?" : "" - let defaultValue = try defaultValueDeclaration(property) - let line = "\(accessLevel) \(kind) \(name): \(type)\(optionality)\(defaultValue ?? "")" + private func printProperty(_ property: SwiftStruct.Property) throws { + let accessLevel = "public" + let kind = property.isMutable ? "var" : "let" + let name = property.name + let type = try typeDeclaration(property.type) + let optionality = property.isOptional ? "?" : "" + let defaultValue: String? = try property.defaultValue.ifNotNil { value in + switch value { + case let integerValue as Int: + return " = \(integerValue)" + case let stringValue as String: + return " = \"\(stringValue)\"" + case let enumValue as SwiftEnum.Case: + return " = .\(enumValue.label)" + default: + throw Exception.unimplemented("Failed to print property default value: \(value)") + } + } + let line = "\(accessLevel) \(kind) \(name): \(type)\(optionality)\(defaultValue ?? "")" - printComment(property.comment) - writeLine(line) + printComment(property.comment) + writeLine(line) + } + private func printPropertiesList(_ properties: [SwiftStruct.Property]) throws { + try properties.enumerated().forEach { index, property in + try printProperty(property) if index < properties.count - 1 { writeEmptyLine() } @@ -94,18 +111,10 @@ public class SwiftPrinter: BasePrinter { } private func printAdditionalProperties(_ additionalProperties: SwiftStruct.Property?) throws { - guard let props = additionalProperties else { return } - - let accessLevel = "public" - let kind = props.isMutable ? "var" : "let" - let type = try typeDeclaration(props.type) - let optionality = props.isOptional ? "?" : "" - let defaultValue = try defaultValueDeclaration(props) - let line = "\(accessLevel) \(kind) \(props.name): \(type)\(optionality)\(defaultValue ?? "")" - - writeEmptyLine() - printComment(props.comment) - writeLine(line) + if let additionalProperties = additionalProperties { + writeEmptyLine() + try printProperty(additionalProperties) + } } private func printCodingKeys(for properties: [SwiftStruct.Property]) { @@ -225,19 +234,4 @@ public class SwiftPrinter: BasePrinter { throw Exception.unimplemented("Printing \(type) is not implemented.") } } - - private func defaultValueDeclaration(_ property: SwiftStruct.Property) throws -> String? { - try property.defaultValue.ifNotNil { value in - switch value { - case let integerValue as Int: - return " = \(integerValue)" - case let stringValue as String: - return " = \"\(stringValue)\"" - case let enumValue as SwiftEnum.Case: - return " = .\(enumValue.label)" - default: - throw Exception.unimplemented("Failed to print property default value: \(value)") - } - } - } } From a0e6b81e3859d706f76816b7f0c078a9c229f9db Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Thu, 4 Feb 2021 10:53:54 +0100 Subject: [PATCH 13/36] RUMM-1000 Factor some more code --- .../JSONSchemaToJSONTypeTransformer.swift | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift index 53b9316956..46e1618609 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift @@ -94,8 +94,8 @@ internal class JSONSchemaToJSONTypeTransformer { let propertiesByName = schema.properties ?? [:] var properties: [JSONObject.Property] = [] - try propertiesByName.forEach { propertyName, propertySchema in - let property = JSONObject.Property( + func property(from propertySchema: JSONSchema, _ propertyName: String, _ isRequired: Bool? = nil) throws -> JSONObject.Property { + return JSONObject.Property( name: propertyName, comment: propertySchema.description, type: try transformSchemaToAnyType(propertySchema, named: propertyName), @@ -105,29 +105,17 @@ internal class JSONSchemaToJSONTypeTransformer { case .string(let value): return .string(value: value) } }, - isRequired: schema.required?.contains(propertyName) ?? Defaults.isRequired, + isRequired: isRequired ?? schema.required?.contains(propertyName) ?? Defaults.isRequired, isReadOnly: propertySchema.readOnly ?? Defaults.isReadOnly ) - - properties.append(property) } + try propertiesByName.forEach { properties.append(try property(from: $1, $0)) } + let additionalProperties: JSONObject.Property? if let additionalPropertiesSchema = schema.additionalProperties { let propName = JSONSchema.CodingKeys.additionalProperties.rawValue - additionalProperties = JSONObject.Property( - name: propName, - comment: additionalPropertiesSchema.description, - type: try transformSchemaToAnyType(additionalPropertiesSchema, named: propName), - defaultValue: additionalPropertiesSchema.const.flatMap { const in - switch const.value { - case .integer(let value): return .integer(value: value) - case .string(let value): return .string(value: value) - } - }, - isRequired: false, - isReadOnly: additionalPropertiesSchema.readOnly ?? Defaults.isReadOnly - ) + additionalProperties = try property(from: additionalPropertiesSchema, propName, false) } else { additionalProperties = nil } From afbf1548546ac731f487760ef260e7ec570857ab Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Thu, 4 Feb 2021 10:57:16 +0100 Subject: [PATCH 14/36] RUMM-1000 Add back exclusion of customTimings to be addressed in a dedicated PR --- .../RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index d39a4efc77..deb919134a 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -104,6 +104,8 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { `struct`.name = format(structName: `struct`.name) `struct`.properties = try `struct`.properties .map { try transform(structProperty: $0) } + // TODO: RUMM-1000 should remove this filter + .filter { property in property.name != "customTimings" } if var additionalProperties = `struct`.additionalProperties { // Store additional/runtime declared properties in a Dictionary indexed by their names: additionalProperties.type = SwiftDictionary(key: SwiftPrimitive(), From ab6131040bda747e3396c8d513ed25c84e4dae7b Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Thu, 4 Feb 2021 13:33:40 +0100 Subject: [PATCH 15/36] RUMM-1000 Lint --- .../ObjcInterop/SwiftToObjcInteropTypeTransformer.swift | 6 ++++-- .../Input/Swift/JSONToSwiftTypeTransformer.swift | 3 +-- .../Output/Printing/ObjcInteropPrinter.swift | 4 ++-- .../RUM/RUMSwiftTypeTransformer.swift | 6 ++++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift index 67744c6313..36e8932785 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift @@ -66,8 +66,10 @@ internal class SwiftToObjcInteropTypeTransformer { case let swiftArray as SwiftArray: return ObjcInteropNSArray(element: try objcInteropType(for: swiftArray.element)) case let swiftDictionary as SwiftDictionary: - return ObjcInteropNSDictionary(key: try objcInteropType(for: swiftDictionary.key), - value: try objcInteropType(for: swiftDictionary.value)) + return ObjcInteropNSDictionary( + key: try objcInteropType(for: swiftDictionary.key), + value: try objcInteropType(for: swiftDictionary.value) + ) default: throw Exception.unimplemented( "Cannot create `ObjcInteropType` type for \(type(of: swiftType))." diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index e4386ea265..85f54b9910 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -99,8 +99,7 @@ internal class JSONToSwiftTypeTransformer { func readAdditionalProperties(from objectAdditionalProperties: JSONObject.Property?) throws -> SwiftStruct.Property? { if let additionalProperties = objectAdditionalProperties { return try property(from: additionalProperties) - } - else { + } else { return nil } } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift index 2329b1af2e..c65700f77a 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift @@ -81,7 +81,7 @@ internal class ObjcInteropPrinter: BasePrinter { try objcInteropRootClass.objcPropertyWrappers.forEach { propertyWrapper in try print(objcInteropPropertyWrapper: propertyWrapper) } - if let additionalPropertiesWrapper = objcInteropRootClass.objcAdditionalPropertiesWrapper { + if let additionalPropertiesWrapper = objcInteropRootClass.objcAdditionalPropertiesWrapper { try print(objcInteropPropertyWrapper: additionalPropertiesWrapper) } indentLeft() @@ -105,7 +105,7 @@ internal class ObjcInteropPrinter: BasePrinter { try objcInteropNestedClass.objcPropertyWrappers.forEach { propertyWrapper in try print(objcInteropPropertyWrapper: propertyWrapper) } - if let additionalPropertiesWrapper = objcInteropNestedClass.objcAdditionalPropertiesWrapper { + if let additionalPropertiesWrapper = objcInteropNestedClass.objcAdditionalPropertiesWrapper { try print(objcInteropPropertyWrapper: additionalPropertiesWrapper) } indentLeft() diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index deb919134a..4e61f9f691 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -108,8 +108,10 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { .filter { property in property.name != "customTimings" } if var additionalProperties = `struct`.additionalProperties { // Store additional/runtime declared properties in a Dictionary indexed by their names: - additionalProperties.type = SwiftDictionary(key: SwiftPrimitive(), - value: additionalProperties.type) + additionalProperties.type = SwiftDictionary( + key: SwiftPrimitive(), + value: additionalProperties.type + ) `struct`.additionalProperties = try transform(structProperty: additionalProperties) } if context.parent == nil { From 41a1ac8d5d76430b972fe3ecedec12cd38d7abfe Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Thu, 4 Feb 2021 14:01:20 +0100 Subject: [PATCH 16/36] RUMM-1000 Exclude DynamicCodingKeys by default in SwiftPrinter until we introduce a model with addional properties --- .../RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift | 3 ++- .../Output/SwiftPrinterTests.swift | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index cf352f0bd3..ae44f60269 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -8,7 +8,8 @@ import Foundation /// Generates Swift code from `SwiftTypes`. public class SwiftPrinter: BasePrinter { - public func print(swiftTypes: [SwiftType], includeDynamicCodingKeys: Bool = true) throws -> String { + // TODO: RUMM-1000 include DynamicCodingKeys by default for additional properties + public func print(swiftTypes: [SwiftType], includeDynamicCodingKeys: Bool = false) throws -> String { reset() if includeDynamicCodingKeys { diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index 368c9e08d5..f44643e8ce 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -120,7 +120,7 @@ final class SwiftPrinterTests: XCTestCase { func testPrintingSwiftStruct() throws { let printer = SwiftPrinter() - let actual = try printer.print(swiftTypes: [`struct`, `enum`]) + let actual = try printer.print(swiftTypes: [`struct`, `enum`], includeDynamicCodingKeys: true) let expected = """ From 8e6fbbf99636356f5a1ce6379928ae392aacca77 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Fri, 5 Feb 2021 21:58:18 +0100 Subject: [PATCH 17/36] RUMM-1000 Backtrack on the approach and model JSONSchemas with additionalProperties as simple Swift Dictionaries --- .../Input/ObjcInterop/ObjcInteropType.swift | 5 - .../SwiftToObjcInteropTypeTransformer.swift | 188 ++++++----- .../Swift/JSONToSwiftTypeTransformer.swift | 75 +++-- .../Input/Swift/SwiftType.swift | 1 - .../Output/Printing/BasePrinter.swift | 6 - .../Output/Printing/ObjcInteropPrinter.swift | 10 +- .../Output/Printing/SwiftPrinter.swift | 130 ++------ .../RUM/RUMSwiftTypeTransformer.swift | 8 - .../JSONToSwiftTypeTransformerTests.swift | 225 ++++++++++--- .../Output/ObjcInteropPrinterTests.swift | 299 +++++++++++++----- .../Output/SwiftPrinterTests.swift | 95 +----- .../RUM/RUMSwiftTypeTransformerTests.swift | 36 +-- 12 files changed, 583 insertions(+), 495 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift index c0f5472170..a29365bf0e 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/ObjcInteropType.swift @@ -13,7 +13,6 @@ internal protocol ObjcInteropType: AnyObject {} internal protocol ObjcInteropClass: ObjcInteropType { var bridgedSwiftStruct: SwiftStruct { get } var objcPropertyWrappers: [ObjcInteropPropertyWrapper] { set get } - var objcAdditionalPropertiesWrapper: ObjcInteropPropertyWrapper? { set get } } /// Schema of a root `@objc class` storing the mutable value of a `SwiftStruct`. @@ -22,8 +21,6 @@ internal class ObjcInteropRootClass: ObjcInteropClass { let bridgedSwiftStruct: SwiftStruct /// `bridgedSwiftStruct's` property wrappers exposed to Objc. var objcPropertyWrappers: [ObjcInteropPropertyWrapper] = [] - /// `bridgedSwiftStruct's` additionalProperties property wrapper exposed to Objc. - var objcAdditionalPropertiesWrapper: ObjcInteropPropertyWrapper? init(bridgedSwiftStruct: SwiftStruct) { self.bridgedSwiftStruct = bridgedSwiftStruct @@ -39,8 +36,6 @@ internal class ObjcInteropTransitiveClass: ObjcInteropClass { let bridgedSwiftStruct: SwiftStruct /// `bridgedSwiftStruct's` property wrappers exposed to Objc. var objcPropertyWrappers: [ObjcInteropPropertyWrapper] = [] - /// `bridgedSwiftStruct's` additionalProperties property wrapper exposed to Objc. - var objcAdditionalPropertiesWrapper: ObjcInteropPropertyWrapper? init(owner: ObjcInteropPropertyWrapper, bridgedSwiftStruct: SwiftStruct) { self.parentProperty = owner diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift index 36e8932785..cb3d9eac36 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift @@ -32,17 +32,98 @@ internal class SwiftToObjcInteropTypeTransformer { private func generateTransitiveObjcInteropTypes(in objcClass: ObjcInteropClass) throws { // Generate property wrappers objcClass.objcPropertyWrappers = try objcClass.bridgedSwiftStruct.properties - .map { try objcInteropPropertyWrapper(for: $0, in: objcClass) } - if let additionalProperties = objcClass.bridgedSwiftStruct.additionalProperties { - objcClass.objcAdditionalPropertiesWrapper = try objcInteropPropertyWrapper(for: additionalProperties, in: objcClass) - } - - var allPropertyWrappers = objcClass.objcPropertyWrappers - if let additionalPropertiesWrapper = objcClass.objcAdditionalPropertiesWrapper { - allPropertyWrappers.append(additionalPropertiesWrapper) - } + .map { swiftProperty in + switch swiftProperty.type { + case let swiftPrimitive as SwiftPrimitiveType: + let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcInteropType = try objcInteropType(for: swiftPrimitive) + return propertyWrapper + case let swiftStruct as SwiftStruct: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedClass = ObjcInteropTransitiveClass( + owner: propertyWrapper, + bridgedSwiftStruct: swiftStruct + ) + return propertyWrapper + case let swiftEnum as SwiftEnum: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedEnum = ObjcInteropEnum( + owner: propertyWrapper, + bridgedSwiftEnum: swiftEnum + ) + return propertyWrapper + case let swiftArray as SwiftArray where swiftArray.element is SwiftEnum: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnumsArray( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedEnumsArray = ObjcInteropEnumArray( + owner: propertyWrapper, + bridgedSwiftEnum: swiftArray.element as! SwiftEnum // swiftlint:disable:this force_cast + ) + return propertyWrapper + case let swiftArray as SwiftArray where swiftArray.element is SwiftPrimitiveType: + let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcInteropType = try objcInteropType(for: swiftArray) + return propertyWrapper + case let swiftDictionary as SwiftDictionary where swiftDictionary.value is SwiftPrimitiveType: + let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcInteropType = try objcInteropType(for: swiftDictionary) + return propertyWrapper + case let swiftDictionary as SwiftDictionary where swiftDictionary.key is SwiftEnum || swiftDictionary.value is SwiftEnum: + throw Exception.unimplemented( + "Objc Interop for `SwiftDictionary`s with an Enum as key or value is not supported." + ) + case let swifTypeReference as SwiftTypeReference: + let referencedType = try resolve(swiftTypeReference: swifTypeReference) + + switch referencedType { + case let swiftStruct as SwiftStruct: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedClass = ObjcInteropReferencedTransitiveClass( + owner: propertyWrapper, + bridgedSwiftStruct: swiftStruct + ) + return propertyWrapper + case let swiftEnum as SwiftEnum: + let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( + owner: objcClass, + swiftProperty: swiftProperty + ) + propertyWrapper.objcNestedEnum = ObjcInteropReferencedEnum( + owner: propertyWrapper, + bridgedSwiftEnum: swiftEnum + ) + return propertyWrapper + default: + throw Exception.illegal("Illegal reference type: \(swifTypeReference)") + } + default: + throw Exception.unimplemented( + "Cannot generate @objc property wrapper for: \(type(of: swiftProperty.type))" + ) + } + } - try allPropertyWrappers + try objcClass.objcPropertyWrappers .compactMap { $0 as? ObjcInteropPropertyWrapperForTransitiveType } .forEach { propertyWrapper in // Store `ObjcInteropTypes` created for property wrappers @@ -77,93 +158,6 @@ internal class SwiftToObjcInteropTypeTransformer { } } - private func objcInteropPropertyWrapper(for swiftProperty: SwiftStruct.Property, in objcClass: ObjcInteropClass) throws -> ObjcInteropPropertyWrapper { - switch swiftProperty.type { - case let swiftPrimitive as SwiftPrimitiveType: - let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcInteropType = try objcInteropType(for: swiftPrimitive) - return propertyWrapper - case let swiftStruct as SwiftStruct: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedClass = ObjcInteropTransitiveClass( - owner: propertyWrapper, - bridgedSwiftStruct: swiftStruct - ) - return propertyWrapper - case let swiftEnum as SwiftEnum: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedEnum = ObjcInteropEnum( - owner: propertyWrapper, - bridgedSwiftEnum: swiftEnum - ) - return propertyWrapper - case let swiftArray as SwiftArray where swiftArray.element is SwiftEnum: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnumsArray( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedEnumsArray = ObjcInteropEnumArray( - owner: propertyWrapper, - bridgedSwiftEnum: swiftArray.element as! SwiftEnum // swiftlint:disable:this force_cast - ) - return propertyWrapper - case let swiftArray as SwiftArray where swiftArray.element is SwiftPrimitiveType: - let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcInteropType = try objcInteropType(for: swiftArray) - return propertyWrapper - case let swiftDictionary as SwiftDictionary where swiftDictionary.value is SwiftPrimitiveType: - let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcInteropType = try objcInteropType(for: swiftDictionary) - return propertyWrapper - case let swifTypeReference as SwiftTypeReference: - let referencedType = try resolve(swiftTypeReference: swifTypeReference) - - switch referencedType { - case let swiftStruct as SwiftStruct: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedStruct( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedClass = ObjcInteropReferencedTransitiveClass( - owner: propertyWrapper, - bridgedSwiftStruct: swiftStruct - ) - return propertyWrapper - case let swiftEnum as SwiftEnum: - let propertyWrapper = ObjcInteropPropertyWrapperAccessingNestedEnum( - owner: objcClass, - swiftProperty: swiftProperty - ) - propertyWrapper.objcNestedEnum = ObjcInteropReferencedEnum( - owner: propertyWrapper, - bridgedSwiftEnum: swiftEnum - ) - return propertyWrapper - default: - throw Exception.illegal("Illegal reference type: \(swifTypeReference)") - } - default: - throw Exception.unimplemented( - "Cannot generate @objc property wrapper for: \(type(of: swiftProperty.type))" - ) - } - } - // MARK: - Helpers /// Filters out given `SwiftTypes` by removing all types referenced using `SwiftReferenceType`. diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index 85f54b9910..b4e8862ad9 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -13,6 +13,9 @@ internal class JSONToSwiftTypeTransformer { } private func transform(jsonObject: JSONObject) throws -> SwiftStruct { + if jsonObject.additionalProperties != nil { + throw Exception.unimplemented("Transforming root object \(jsonObject) with `additionalProperties` is not supported.") + } var `struct` = try transformJSONToStruct(jsonObject) `struct` = resolveTransitiveMutableProperties(in: `struct`) return `struct` @@ -29,7 +32,7 @@ internal class JSONToSwiftTypeTransformer { case let jsonEnumeration as JSONEnumeration: return transformJSONToEnum(jsonEnumeration) case let jsonObject as JSONObject: - return try transformJSONToStruct(jsonObject) + return try transformJSONObject(jsonObject) default: throw Exception.unimplemented("Transforming \(json) into `SwiftType` is not supported.") } @@ -61,46 +64,49 @@ internal class JSONToSwiftTypeTransformer { ) } - private func transformJSONToStruct(_ jsonObject: JSONObject) throws -> SwiftStruct { - /// Reads Struct property default value. - func readDefaultValue(for objectProperty: JSONObject.Property) throws -> SwiftPropertyDefaultValue? { - return objectProperty.defaultValue.ifNotNil { value in - switch value { - case .integer(let intValue): - return intValue - case .string(let stringValue): - if objectProperty.type is JSONEnumeration { - return SwiftEnum.Case(label: stringValue, rawValue: stringValue) - } else { - return stringValue - } - } + private func transformJSONObject(_ jsonObject: JSONObject) throws -> SwiftType { + if let additionalProperties = jsonObject.additionalProperties { + if jsonObject.properties.count > 0 { + throw Exception.unimplemented("Transforming \(jsonObject) with both `properties` and `additionalProperties` is not supported.") } - } - - func property(from objectProperty: JSONObject.Property) throws -> SwiftStruct.Property { - return SwiftStruct.Property( - name: objectProperty.name, - comment: objectProperty.comment, - type: try transformJSONToAnyType(objectProperty.type), - isOptional: !objectProperty.isRequired, - isMutable: !objectProperty.isReadOnly, - defaultValue: try readDefaultValue(for: objectProperty), - codingKey: objectProperty.name + return SwiftDictionary( + key: SwiftPrimitive(), + value: try transformJSONToAnyType(additionalProperties.type) ) + } else { + return try transformJSONToStruct(jsonObject) } + } + private func transformJSONToStruct(_ jsonObject: JSONObject) throws -> SwiftStruct { /// Reads Struct properties. func readProperties(from objectProperties: [JSONObject.Property]) throws -> [SwiftStruct.Property] { - return try objectProperties.map { try property(from: $0) } - } + /// Reads Struct property default value. + func readDefaultValue(for objectProperty: JSONObject.Property) throws -> SwiftPropertyDefaultValue? { + return objectProperty.defaultValue.ifNotNil { value in + switch value { + case .integer(let intValue): + return intValue + case .string(let stringValue): + if objectProperty.type is JSONEnumeration { + return SwiftEnum.Case(label: stringValue, rawValue: stringValue) + } else { + return stringValue + } + } + } + } - /// Reads Struct additional properties. - func readAdditionalProperties(from objectAdditionalProperties: JSONObject.Property?) throws -> SwiftStruct.Property? { - if let additionalProperties = objectAdditionalProperties { - return try property(from: additionalProperties) - } else { - return nil + return try objectProperties.map { jsonProperty in + return SwiftStruct.Property( + name: jsonProperty.name, + comment: jsonProperty.comment, + type: try transformJSONToAnyType(jsonProperty.type), + isOptional: !jsonProperty.isRequired, + isMutable: !jsonProperty.isReadOnly, + defaultValue: try readDefaultValue(for: jsonProperty), + codingKey: jsonProperty.name + ) } } @@ -108,7 +114,6 @@ internal class JSONToSwiftTypeTransformer { name: jsonObject.name, comment: jsonObject.comment, properties: try readProperties(from: jsonObject.properties), - additionalProperties: try readAdditionalProperties(from: jsonObject.additionalProperties), conformance: [] ) } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift index 4a48f9e49b..e90ee7500a 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift @@ -59,7 +59,6 @@ internal struct SwiftStruct: SwiftType { var name: String var comment: String? var properties: [Property] - var additionalProperties: Property? var conformance: [SwiftProtocol] } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift index 9e2c2b8d9b..c6b8375d83 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/BasePrinter.swift @@ -36,12 +36,6 @@ public class BasePrinter { output += "\n" } - func indent(_ codeBlock: () throws -> Void) throws { - indentRight() - try codeBlock() - indentLeft() - } - func indentRight() { indentationLevel += 1 } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift index c65700f77a..3b787ec5d8 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift @@ -81,9 +81,6 @@ internal class ObjcInteropPrinter: BasePrinter { try objcInteropRootClass.objcPropertyWrappers.forEach { propertyWrapper in try print(objcInteropPropertyWrapper: propertyWrapper) } - if let additionalPropertiesWrapper = objcInteropRootClass.objcAdditionalPropertiesWrapper { - try print(objcInteropPropertyWrapper: additionalPropertiesWrapper) - } indentLeft() writeLine("}") } @@ -105,9 +102,6 @@ internal class ObjcInteropPrinter: BasePrinter { try objcInteropNestedClass.objcPropertyWrappers.forEach { propertyWrapper in try print(objcInteropPropertyWrapper: propertyWrapper) } - if let additionalPropertiesWrapper = objcInteropNestedClass.objcAdditionalPropertiesWrapper { - try print(objcInteropPropertyWrapper: additionalPropertiesWrapper) - } indentLeft() writeLine("}") } @@ -363,9 +357,11 @@ internal class ObjcInteropPrinter: BasePrinter { .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftArray` with elements of type: \(type(of: swiftArray.element))")) return ".map { $0\(elementCast) }" case let swiftDictionary as SwiftDictionary: + let keyCast = try objcToSwiftCast(for: swiftDictionary.key) + .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftDictionary` with keys of type: \(type(of: swiftDictionary.key))")) let valueCast = try objcToSwiftCast(for: swiftDictionary.value) .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftDictionary` with values of type: \(type(of: swiftDictionary.value))")) - return ".map { $0\(valueCast) }" + return ".reduce(into: [:]) { $0[$1.0\(keyCast)] = $1.1\(valueCast)" case _ as SwiftPrimitive: return nil // `String` <> `NSString` interoperability doesn't require casting default: diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index ae44f60269..596c0f003d 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -8,15 +8,9 @@ import Foundation /// Generates Swift code from `SwiftTypes`. public class SwiftPrinter: BasePrinter { - // TODO: RUMM-1000 include DynamicCodingKeys by default for additional properties - public func print(swiftTypes: [SwiftType], includeDynamicCodingKeys: Bool = false) throws -> String { + public func print(swiftTypes: [SwiftType]) throws -> String { reset() - if includeDynamicCodingKeys { - writeEmptyLine() - printDynamicCodingKeys() - } - try swiftTypes.forEach { type in writeEmptyLine() if let `struct` = type as? SwiftStruct { @@ -33,20 +27,6 @@ public class SwiftPrinter: BasePrinter { // MARK: - Private - private func printDynamicCodingKeys() { - // DynamicCodingKey is used to wrap String based keys of additional properties. - let code = """ - fileprivate struct DynamicCodingKey: CodingKey { - var stringValue: String - var intValue: Int? - init?(stringValue: String) { self.stringValue = stringValue } - init?(intValue: Int) { return nil } - init(_ string: String) { self.stringValue = string } - } - """ - writeLine(code) - } - private func printStruct(_ swiftStruct: SwiftStruct) throws { let implementedProtocols = swiftStruct.conformance.map { $0.name } let conformance = implementedProtocols.isEmpty ? "" : ": \(implementedProtocols.joined(separator: ", "))" @@ -55,17 +35,8 @@ public class SwiftPrinter: BasePrinter { writeLine("public struct \(swiftStruct.name)\(conformance) {") indentRight() try printPropertiesList(swiftStruct.properties) - try printAdditionalProperties(swiftStruct.additionalProperties) if swiftStruct.conforms(to: codableProtocol) { printCodingKeys(for: swiftStruct.properties) - if let additionalProperties = swiftStruct.additionalProperties { - // Additional properties need to be flattened up at the root level, instead of being under a dedicated key. - // Thus the need for some ad hoc encode/decode implementation of *all* properties. - try printCodableMethods( - for: swiftStruct.properties, - additionalProperties: additionalProperties - ) - } } try printNestedTypes(in: swiftStruct) indentLeft() @@ -78,46 +49,35 @@ public class SwiftPrinter: BasePrinter { } } - private func printProperty(_ property: SwiftStruct.Property) throws { - let accessLevel = "public" - let kind = property.isMutable ? "var" : "let" - let name = property.name - let type = try typeDeclaration(property.type) - let optionality = property.isOptional ? "?" : "" - let defaultValue: String? = try property.defaultValue.ifNotNil { value in - switch value { - case let integerValue as Int: - return " = \(integerValue)" - case let stringValue as String: - return " = \"\(stringValue)\"" - case let enumValue as SwiftEnum.Case: - return " = .\(enumValue.label)" - default: - throw Exception.unimplemented("Failed to print property default value: \(value)") + private func printPropertiesList(_ properties: [SwiftStruct.Property]) throws { + try properties.enumerated().forEach { index, property in + let accessLevel = "public" + let kind = property.isMutable ? "var" : "let" + let name = property.name + let type = try typeDeclaration(property.type) + let optionality = property.isOptional ? "?" : "" + let defaultValue: String? = try property.defaultValue.ifNotNil { value in + switch value { + case let integerValue as Int: + return " = \(integerValue)" + case let stringValue as String: + return " = \"\(stringValue)\"" + case let enumValue as SwiftEnum.Case: + return " = .\(enumValue.label)" + default: + throw Exception.unimplemented("Failed to print prooperty default value: \(value)") + } } - } - let line = "\(accessLevel) \(kind) \(name): \(type)\(optionality)\(defaultValue ?? "")" - printComment(property.comment) - writeLine(line) - } + printComment(property.comment) + writeLine("\(accessLevel) \(kind) \(name): \(type)\(optionality)\(defaultValue ?? "")") - private func printPropertiesList(_ properties: [SwiftStruct.Property]) throws { - try properties.enumerated().forEach { index, property in - try printProperty(property) if index < properties.count - 1 { writeEmptyLine() } } } - private func printAdditionalProperties(_ additionalProperties: SwiftStruct.Property?) throws { - if let additionalProperties = additionalProperties { - writeEmptyLine() - try printProperty(additionalProperties) - } - } - private func printCodingKeys(for properties: [SwiftStruct.Property]) { writeEmptyLine() writeLine("enum CodingKeys: String, CodingKey {") @@ -129,54 +89,6 @@ public class SwiftPrinter: BasePrinter { writeLine("}") } - private func printCodableMethods(for properties: [SwiftStruct.Property], additionalProperties: SwiftStruct.Property) throws { - writeEmptyLine() - writeLine("func encode(to encoder: Encoder) throws {") - try indent { - if properties.count > 0 { - writeLine("var propsContainer = encoder.container(keyedBy: CodingKeys.self)") - properties.forEach { property in - writeLine("try propsContainer.encode(\(property.name), forKey: .\(property.codingKey))") - } - writeEmptyLine() - } - - writeLine("var addPropsContainer = encoder.container(keyedBy: DynamicCodingKey.self)") - writeLine("try additionalProperties.forEach { key, value in") - try indent { - writeLine("try addPropsContainer.encode(value, forKey: DynamicCodingKey(key))") - } - writeLine("}") - } - writeLine("}") - - writeEmptyLine() - writeLine("init(from decoder: Decoder) throws {") - try indent { - if properties.count > 0 { - writeLine("var propsContainer = decoder.container(keyedBy: CodingKeys.self)") - try properties.forEach { property in - let typeName = try typeDeclaration(property.type) - writeLine("\(property.name) = try propsContainer.decode(\(typeName).self, forKey: .\(property.codingKey))") - } - writeEmptyLine() - } - - if let dictionary = additionalProperties.type as? SwiftDictionary { - let typeName = try typeDeclaration(dictionary.value) - writeLine("var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self)") - writeLine("let allKeys = addPropsContainer.allKeys") - writeLine("try allKeys.forEach { key in") - try indent { - writeLine("let value = try addPropsContainer.decode(\(typeName).self, forKey: key)") - writeLine("additionalProperties[key] = value") - } - writeLine("}") - } - } - writeLine("}") - } - private func printNestedTypes(in swiftStruct: SwiftStruct) throws { let nestedTypes = swiftStruct.properties.map { $0.type } try nestedTypes.forEach { type in diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index 4e61f9f691..8d2a3b01d6 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -106,14 +106,6 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { .map { try transform(structProperty: $0) } // TODO: RUMM-1000 should remove this filter .filter { property in property.name != "customTimings" } - if var additionalProperties = `struct`.additionalProperties { - // Store additional/runtime declared properties in a Dictionary indexed by their names: - additionalProperties.type = SwiftDictionary( - key: SwiftPrimitive(), - value: additionalProperties.type - ) - `struct`.additionalProperties = try transform(structProperty: additionalProperties) - } if context.parent == nil { `struct`.conformance = [rumDataModelProtocol] // Conform root structs to `RUMDataModel` } else { diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index 9993c4f184..e255061ee5 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -67,37 +67,8 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { defaultValue: nil, isRequired: false, isReadOnly: false - ), - JSONObject.Property( - name: "propertyWithAdditionalProperties", - comment: "Description of a property with nested additional properties.", - type: JSONObject( - name: "propertyWithAdditionalProperties", - comment: "Description of a property with nested additional properties.", - properties: [], - additionalProperties: - JSONObject.Property( - name: "additionalProperties", - comment: nil, - type: JSONPrimitive.integer, - defaultValue: nil, - isRequired: false, - isReadOnly: true - ) - ), - defaultValue: nil, - isRequired: false, - isReadOnly: true ) - ], - additionalProperties: JSONObject.Property( - name: "additionalProperties", - comment: "Additional properties of Foo.", - type: JSONPrimitive.string, - defaultValue: nil, - isRequired: false, - isReadOnly: true - ) + ] ) let expected = SwiftStruct( @@ -176,40 +147,196 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { isMutable: true, defaultValue: nil, codingKey: "property2" - ), - SwiftStruct.Property( + ) + ], + conformance: [] + ) + + let actual = try JSONToSwiftTypeTransformer().transform(jsonObjects: [object]) + + XCTAssertEqual(actual.count, 1) + XCTAssertEqual(expected, actual[0]) + } + + func testTransformingNestedJSONObjectWithAdditionalPropertiesIntoSwiftDictionaryInsideRootStruct() throws { + let object = JSONObject( + name: "Foo", + comment: "Description of Foo.", + properties: [ + JSONObject.Property( name: "propertyWithAdditionalProperties", comment: "Description of a property with nested additional properties.", - type: SwiftStruct( + type: JSONObject( name: "propertyWithAdditionalProperties", comment: "Description of a property with nested additional properties.", properties: [], - additionalProperties: SwiftStruct.Property( - name: "additionalProperties", - comment: nil, - type: SwiftPrimitive(), - isOptional: true, - isMutable: false, - defaultValue: nil, - codingKey: "additionalProperties" - ), - conformance: [] + additionalProperties: + JSONObject.Property( + name: "additionalProperties", + comment: nil, + type: JSONPrimitive.integer, + defaultValue: nil, + isRequired: false, + isReadOnly: true // how to reconcile with additionalProperties's required/readOnly? + ) ), + defaultValue: nil, + isRequired: false, + isReadOnly: true // how to reconcile with additionalProperties's required/readOnly? + ) + ] + ) + + let expected = SwiftStruct( + name: "Foo", + comment: "Description of Foo.", + properties: [ + SwiftStruct.Property( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + type: SwiftDictionary(key: SwiftPrimitive(), + value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, codingKey: "propertyWithAdditionalProperties" + )], + conformance: [] + ) + + let actual = try JSONToSwiftTypeTransformer().transform(jsonObjects: [object]) + + XCTAssertEqual(actual.count, 1) + XCTAssertEqual(expected, actual[0]) + } + + func testTransformingNestedJSONObjectWithPropertiesAndAdditionalPropertiesIntoSwiftStruct() throws { + let object = JSONObject( + name: "Foo", + comment: "Description of Foo.", + properties: [JSONObject.Property( + name: "bar", + comment: "Description of Foo's `bar`.", + type: JSONObject( + name: "bar", + comment: "Description of Foo's `baz`.", + properties: [ + JSONObject.Property( + name: "baz", + comment: "Description of Foo.bar's `baz`.", + type: JSONPrimitive.string, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) + ], + additionalProperties: JSONObject.Property( + name: "additionalProperties", + comment: "Additional properties of property1.", + type: JSONPrimitive.string, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) + ), + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) + ] + ) + + var error: Error? = nil + XCTAssertThrowsError(try JSONToSwiftTypeTransformer().transform(jsonObjects: [object])) { error = $0 } + let exception = try XCTUnwrap(error as? Exception) + XCTAssertTrue(exception.description.contains("not supported")) + } + + func testTransformingRootJSONObjectWithAdditionalPropertiesIntoSwiftStruct() throws { + let object = JSONObject( + name: "Foo", + comment: "Description of Foo.", + properties: [JSONObject.Property( + name: "bar", + comment: "Description of Foo's `bar`.", + type: JSONObject( + name: "bar", + comment: "Description of Foo's `baz`.", + properties: [ + JSONObject.Property( + name: "baz", + comment: "Description of Foo.bar's `baz`.", + type: JSONPrimitive.string, + defaultValue: nil, + isRequired: false, + isReadOnly: true + ) + ] + ), + defaultValue: nil, + isRequired: false, + isReadOnly: true ) ], - additionalProperties: SwiftStruct.Property( + additionalProperties: JSONObject.Property( name: "additionalProperties", comment: "Additional properties of Foo.", - type: SwiftPrimitive(), - isOptional: true, - isMutable: false, + type: JSONPrimitive.string, defaultValue: nil, - codingKey: "additionalProperties" - ), + isRequired: false, + isReadOnly: true + ) + ) + + var error: Error? = nil + XCTAssertThrowsError(try JSONToSwiftTypeTransformer().transform(jsonObjects: [object])) { error = $0 } + let exception = try XCTUnwrap(error as? Exception) + XCTAssertTrue(exception.description.contains("not supported")) + } + + func testTransformingJSONObjectPropertyWithAdditionalPropertiesAndConflictingFlags() throws { + let object = JSONObject( + name: "Foo", + comment: "Description of Foo.", + properties: [ + JSONObject.Property( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + type: JSONObject( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + properties: [], + additionalProperties: + JSONObject.Property( + name: "additionalProperties", + comment: nil, + type: JSONPrimitive.integer, + defaultValue: nil, + isRequired: false, + isReadOnly: false + ) + ), + defaultValue: nil, + isRequired: true, // Expect this flag to be take precedence over the inner `additionalProperties`. + isReadOnly: true // Expect this flag to be take precedence over the inner `additionalProperties`. + ) + ] + ) + + let expected = SwiftStruct( + name: "Foo", + comment: "Description of Foo.", + properties: [ + SwiftStruct.Property( + name: "propertyWithAdditionalProperties", + comment: "Description of a property with nested additional properties.", + type: SwiftDictionary(key: SwiftPrimitive(), + value: SwiftPrimitive()), + isOptional: false, + isMutable: false, + defaultValue: nil, + codingKey: "propertyWithAdditionalProperties" + )], conformance: [] ) diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift index a66b40519b..cfdd95f3d7 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift @@ -18,7 +18,7 @@ final class ObjcInteropPrinterTests: XCTestCase { return """ // MARK: - Swift - \(try swiftPrinter.print(swiftTypes: swiftTypes, includeDynamicCodingKeys: false)) + \(try swiftPrinter.print(swiftTypes: swiftTypes)) // MARK: - ObjcInterop \(try objcInteropPrinter.print(objcInteropTypes: objcInteropTypes)) """ @@ -958,6 +958,226 @@ final class ObjcInteropPrinterTests: XCTestCase { XCTAssertEqual(expected, actual) } + // MARK: - Property wrappers for Swift Dictionaries + + func testPrintingObjcInteropForSwiftStructWithStringDictionaryProperties() throws { + let fooStruct = SwiftStruct( + name: "Foo", + comment: nil, + properties: [ + .mock( + propertyName: "immutableStrings", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: false, + isMutable: false + ), + .mock( + propertyName: "optionalImmutableStrings", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: false + ), + .mock( + propertyName: "mutableStrings", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: false, + isMutable: true + ), + .mock( + propertyName: "optionalMutableStrings", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: true + ), + ], + conformance: [] + ) + + let expected = """ + // MARK: - Swift + + public struct Foo { + public let immutableStrings: [String: String] + + public let optionalImmutableStrings: [String: String]? + + public var mutableStrings: [String: String] + + public var optionalMutableStrings: [String: String]? + } + + // MARK: - ObjcInterop + + @objc + public class DDFoo: NSObject { + internal var swiftModel: Foo + internal var root: DDFoo { self } + + internal init(swiftModel: Foo) { + self.swiftModel = swiftModel + } + + @objc public var immutableStrings: [String: String] { + root.swiftModel.immutableStrings + } + + @objc public var optionalImmutableStrings: [String: String]? { + root.swiftModel.optionalImmutableStrings + } + + @objc public var mutableStrings: [String: String] { + set { root.swiftModel.mutableStrings = newValue } + get { root.swiftModel.mutableStrings } + } + + @objc public var optionalMutableStrings: [String: String]? { + set { root.swiftModel.optionalMutableStrings = newValue } + get { root.swiftModel.optionalMutableStrings } + } + } + + """ + + let actual = try printSwiftWithObjcInterop(for: [fooStruct]) + + XCTAssertEqual(expected, actual) + } + + func testPrintingObjcInteropForSwiftStructWithInt64DictionaryProperties() throws { + let fooStruct = SwiftStruct( + name: "Foo", + comment: nil, + properties: [ + .mock( + propertyName: "immutableInt64s", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: false, + isMutable: false + ), + .mock( + propertyName: "optionalImmutableInt64s", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: false + ), + .mock( + propertyName: "mutableInt64s", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: false, + isMutable: true + ), + .mock( + propertyName: "optionalMutableInt64s", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: true + ), + ], + conformance: [] + ) + + let expected = """ + // MARK: - Swift + + public struct Foo { + public let immutableInt64s: [Int64: Int64] + + public let optionalImmutableInt64s: [Int64: Int64]? + + public var mutableInt64s: [Int64: Int64] + + public var optionalMutableInt64s: [Int64: Int64]? + } + + // MARK: - ObjcInterop + + @objc + public class DDFoo: NSObject { + internal var swiftModel: Foo + internal var root: DDFoo { self } + + internal init(swiftModel: Foo) { + self.swiftModel = swiftModel + } + + @objc public var immutableInt64s: [NSNumber: NSNumber] { + root.swiftModel.immutableInt64s as [NSNumber: NSNumber] + } + + @objc public var optionalImmutableInt64s: [NSNumber: NSNumber]? { + root.swiftModel.optionalImmutableInt64s as [NSNumber: NSNumber]? + } + + @objc public var mutableInt64s: [NSNumber: NSNumber] { + set { root.swiftModel.mutableInt64s = newValue.reduce(into: [:]) { $0[$1.0.int64Value] = $1.1.int64Value } + get { root.swiftModel.mutableInt64s as [NSNumber: NSNumber] } + } + + @objc public var optionalMutableInt64s: [NSNumber: NSNumber]? { + set { root.swiftModel.optionalMutableInt64s = newValue?.reduce(into: [:]) { $0[$1.0.int64Value] = $1.1.int64Value } + get { root.swiftModel.optionalMutableInt64s as [NSNumber: NSNumber]? } + } + } + + """ + + let actual = try printSwiftWithObjcInterop(for: [fooStruct]) + + XCTAssertEqual(expected, actual) + } + + func testPrintingObjcInteropForSwiftStructWithEnumDictionaryProperties() throws { + func mockEnumeration(named name: String) -> SwiftEnum { + return SwiftEnum( + name: name, + comment: nil, + cases: [ + SwiftEnum.Case(label: "option1", rawValue: "option1"), + SwiftEnum.Case(label: "option2", rawValue: "option2"), + SwiftEnum.Case(label: "option3", rawValue: "option3"), + ], + conformance: [] + ) + } + + let fooStruct = SwiftStruct( + name: "Foo", + comment: nil, + properties: [ + .mock( + propertyName: "immutableEnums", + type: SwiftDictionary(key: SwiftPrimitive(), value: mockEnumeration(named: "Options1")), + isOptional: false, + isMutable: false + ), + .mock( + propertyName: "optionalImmutableEnums", + type:SwiftDictionary(key: SwiftPrimitive(), value: mockEnumeration(named: "Options2")), + isOptional: true, + isMutable: false + ), + .mock( + propertyName: "immutableEnumKeys", + type: SwiftDictionary(key: mockEnumeration(named: "Options1"), value: SwiftPrimitive()), + isOptional: false, + isMutable: false + ), + .mock( + propertyName: "optionalImmutableEnumKeys", + type: SwiftDictionary(key: mockEnumeration(named: "Options1"), value: SwiftPrimitive()), + isOptional: true, + isMutable: false + ), + ], + conformance: [] + ) + + var error: Error? = nil + XCTAssertThrowsError(try printSwiftWithObjcInterop(for: [fooStruct])) { error = $0 } + let exception = try XCTUnwrap(error as? Exception) + XCTAssertTrue(exception.description.contains("not supported")) + } + // MARK: - Nested Swift Structs and Enums func testPrintingObjcInteropForSwiftStructWithNestedStructs() throws { @@ -1294,83 +1514,6 @@ final class ObjcInteropPrinterTests: XCTestCase { XCTAssertEqual(expected, actual) } - // MARK: - Property wrappers for additional properties in Swift Structs - - func testPrintingObjcInteropForSwiftStructsWithAdditionalProperties() throws { - let fooStruct = SwiftStruct( - name: "Foo", - comment: nil, - properties: [ - .mock( - propertyName: "bar", - type: SwiftStruct( - name: "Bar", - comment: nil, - properties: [], - conformance: [] - ), - isOptional: false, - isMutable: true - ) - ], - additionalProperties: .mock( - propertyName: "additionalProperties", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), - isOptional: true, - isMutable: true - ), - conformance: [] - ) - - let expected = """ - // MARK: - Swift - - public struct Foo { - public var bar: Bar - - public var additionalProperties: [String: String]? - - public struct Bar { - } - } - - // MARK: - ObjcInterop - - @objc - public class DDFoo: NSObject { - internal var swiftModel: Foo - internal var root: DDFoo { self } - - internal init(swiftModel: Foo) { - self.swiftModel = swiftModel - } - - @objc public var bar: DDFooBar { - DDFooBar(root: root) - } - - @objc public var additionalProperties: [String: String]? { - set { root.swiftModel.additionalProperties = newValue } - get { root.swiftModel.additionalProperties } - } - } - - @objc - public class DDFooBar: NSObject { - internal let root: DDFoo - - internal init(root: DDFoo) { - self.root = root - } - } - - """ - - let actual = try printSwiftWithObjcInterop(for: [fooStruct]) - - XCTAssertEqual(expected, actual) - } - // MARK: - Referenced Swift Structs and Enums func testPrintingObjcInteropForSwiftStructsWithReferencedStructAndEnum() throws { diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index f44643e8ce..08778a54ab 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -38,15 +38,6 @@ final class SwiftPrinterTests: XCTestCase { codingKey: "property2" ) ], - additionalProperties: SwiftStruct.Property( - name: "additionalProperties", - comment: "Additional properties of Bar.", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), - isOptional: true, - isMutable: true, - defaultValue: nil, - codingKey: "additionalProperties" - ), conformance: [codableProtocol] ), isOptional: true, @@ -93,17 +84,17 @@ final class SwiftPrinterTests: XCTestCase { isMutable: true, defaultValue: nil, codingKey: "buzz" + ), + SwiftStruct.Property( + name: "propertiesByNames", + comment: "Description of FooBar's `propertiesByNames`.", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: false, + defaultValue: nil, + codingKey: "propertiesByNames" ) ], - additionalProperties: SwiftStruct.Property( - name: "additionalProperties", - comment: "Additional properties of FooBar.", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), - isOptional: true, - isMutable: false, - defaultValue: nil, - codingKey: "additionalProperties" - ), conformance: [SwiftProtocol(name: "RUMDataModel", conformance: [codableProtocol])] ) @@ -120,18 +111,10 @@ final class SwiftPrinterTests: XCTestCase { func testPrintingSwiftStruct() throws { let printer = SwiftPrinter() - let actual = try printer.print(swiftTypes: [`struct`, `enum`], includeDynamicCodingKeys: true) + let actual = try printer.print(swiftTypes: [`struct`, `enum`]) let expected = """ - fileprivate struct DynamicCodingKey: CodingKey { - var stringValue: String - var intValue: Int? - init?(stringValue: String) { self.stringValue = stringValue } - init?(intValue: Int) { return nil } - init(_ string: String) { self.stringValue = string } - } - /// Description of FooBar. public struct FooBar: RUMDataModel { /// Description of Bar. @@ -143,39 +126,14 @@ final class SwiftPrinterTests: XCTestCase { /// Description of FooBar's `buzz`. public var buzz: [Buzz]? - /// Additional properties of FooBar. - public let additionalProperties: [String: Int]? + /// Description of FooBar's `propertiesByNames`. + public let propertiesByNames: [String: String]? enum CodingKeys: String, CodingKey { case bar = "bar" case bizz = "bizz" case buzz = "buzz" - } - - func encode(to encoder: Encoder) throws { - var propsContainer = encoder.container(keyedBy: CodingKeys.self) - try propsContainer.encode(bar, forKey: .bar) - try propsContainer.encode(bizz, forKey: .bizz) - try propsContainer.encode(buzz, forKey: .buzz) - - var addPropsContainer = encoder.container(keyedBy: DynamicCodingKey.self) - try additionalProperties.forEach { key, value in - try addPropsContainer.encode(value, forKey: DynamicCodingKey(key)) - } - } - - init(from decoder: Decoder) throws { - var propsContainer = decoder.container(keyedBy: CodingKeys.self) - bar = try propsContainer.decode(BAR.self, forKey: .bar) - bizz = try propsContainer.decode(Bizz.self, forKey: .bizz) - buzz = try propsContainer.decode([Buzz].self, forKey: .buzz) - - var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self) - let allKeys = addPropsContainer.allKeys - try allKeys.forEach { key in - let value = try addPropsContainer.decode(Int.self, forKey: key) - additionalProperties[key] = value - } + case propertiesByNames = "propertiesByNames" } /// Description of Bar. @@ -186,37 +144,10 @@ final class SwiftPrinterTests: XCTestCase { /// Description of Bar's `property2`. public var property2: String - /// Additional properties of Bar. - public var additionalProperties: [String: String]? - enum CodingKeys: String, CodingKey { case property1 = "property1" case property2 = "property2" } - - func encode(to encoder: Encoder) throws { - var propsContainer = encoder.container(keyedBy: CodingKeys.self) - try propsContainer.encode(property1, forKey: .property1) - try propsContainer.encode(property2, forKey: .property2) - - var addPropsContainer = encoder.container(keyedBy: DynamicCodingKey.self) - try additionalProperties.forEach { key, value in - try addPropsContainer.encode(value, forKey: DynamicCodingKey(key)) - } - } - - init(from decoder: Decoder) throws { - var propsContainer = decoder.container(keyedBy: CodingKeys.self) - property1 = try propsContainer.decode(String.self, forKey: .property1) - property2 = try propsContainer.decode(String.self, forKey: .property2) - - var addPropsContainer = decoder.container(keyedBy: DynamicCodingKey.self) - let allKeys = addPropsContainer.allKeys - try allKeys.forEach { key in - let value = try addPropsContainer.decode(String.self, forKey: key) - additionalProperties[key] = value - } - } } /// Description of FooBar's `bizz`. diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift index 194ea44701..9c8742a10b 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift @@ -85,17 +85,17 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { isMutable: true, defaultValue: nil, codingKey: "property2" + ), + SwiftStruct.Property( + name: "propertiesByNames", + comment: "Description of Foobar's `propertiesByNames`", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: true, + defaultValue: nil, + codingKey: "propertiesByNames" ) ], - additionalProperties: SwiftStruct.Property( - name: "additionalProperties", - comment: "Additional properties of FooBar.", - type: SwiftPrimitive(), - isOptional: true, - isMutable: false, - defaultValue: nil, - codingKey: "additionalProperties" - ), conformance: [] ) @@ -178,17 +178,17 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { isMutable: true, defaultValue: nil, codingKey: "property2" + ), + SwiftStruct.Property( + name: "propertiesByNames", + comment: "Description of Foobar's `propertiesByNames`", + type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + isOptional: true, + isMutable: true, + defaultValue: nil, + codingKey: "propertiesByNames" ) ], - additionalProperties: SwiftStruct.Property( - name: "additionalProperties", - comment: "Additional properties of FooBar.", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), - isOptional: true, - isMutable: false, - defaultValue: nil, - codingKey: "additionalProperties" - ), conformance: [SwiftProtocol(name: "RUMDataModel", conformance: [codableProtocol])] ) ] From e43c911e7a2cf9a62f8fb10e69ff960a36ea4003 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Mon, 8 Feb 2021 10:08:36 +0100 Subject: [PATCH 18/36] RUMM-1000 Lint --- .../JSONToSwiftTypeTransformerTests.swift | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index e255061ee5..f31ade3827 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -194,13 +194,16 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { SwiftStruct.Property( name: "propertyWithAdditionalProperties", comment: "Description of a property with nested additional properties.", - type: SwiftDictionary(key: SwiftPrimitive(), - value: SwiftPrimitive()), + type: SwiftDictionary( + key: SwiftPrimitive(), + value: SwiftPrimitive() + ), isOptional: true, isMutable: false, defaultValue: nil, codingKey: "propertyWithAdditionalProperties" - )], + ) + ], conformance: [] ) @@ -214,7 +217,8 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { let object = JSONObject( name: "Foo", comment: "Description of Foo.", - properties: [JSONObject.Property( + properties: [ + JSONObject.Property( name: "bar", comment: "Description of Foo's `bar`.", type: JSONObject( @@ -256,7 +260,8 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { let object = JSONObject( name: "Foo", comment: "Description of Foo.", - properties: [JSONObject.Property( + properties: [ + JSONObject.Property( name: "bar", comment: "Description of Foo's `bar`.", type: JSONObject( @@ -330,13 +335,16 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { SwiftStruct.Property( name: "propertyWithAdditionalProperties", comment: "Description of a property with nested additional properties.", - type: SwiftDictionary(key: SwiftPrimitive(), - value: SwiftPrimitive()), + type: SwiftDictionary( + key: SwiftPrimitive(), + value: SwiftPrimitive() + ), isOptional: false, isMutable: false, defaultValue: nil, codingKey: "propertyWithAdditionalProperties" - )], + ) + ], conformance: [] ) From 8c3221edd2e9856ef735048f292784dedc21a0a2 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Mon, 8 Feb 2021 13:00:52 +0100 Subject: [PATCH 19/36] RUMM-1000 Make SwiftDictionary a String: Value type and add a JSONObject.AdditionalProperties --- .../JSONSchemaToJSONTypeTransformer.swift | 19 ++-- .../Input/JSON/JSONType.swift | 10 +- .../SwiftToObjcInteropTypeTransformer.swift | 6 +- .../Swift/JSONToSwiftTypeTransformer.swift | 3 +- .../Input/Swift/SwiftType.swift | 4 +- .../Output/Printing/ObjcInteropPrinter.swift | 3 +- .../Output/Printing/SwiftPrinter.swift | 4 +- .../RUM/RUMSwiftTypeTransformer.swift | 6 +- ...JSONSchemaToJSONTypeTransformerTests.swift | 10 +- .../JSONToSwiftTypeTransformerTests.swift | 30 ++---- .../Output/ObjcInteropPrinterTests.swift | 96 +++++-------------- .../Output/SwiftPrinterTests.swift | 2 +- .../RUM/RUMSwiftTypeTransformerTests.swift | 4 +- 13 files changed, 63 insertions(+), 134 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift index 46e1618609..ce51dd93eb 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONSchemaToJSONTypeTransformer.swift @@ -94,8 +94,8 @@ internal class JSONSchemaToJSONTypeTransformer { let propertiesByName = schema.properties ?? [:] var properties: [JSONObject.Property] = [] - func property(from propertySchema: JSONSchema, _ propertyName: String, _ isRequired: Bool? = nil) throws -> JSONObject.Property { - return JSONObject.Property( + try propertiesByName.forEach { propertyName, propertySchema in + let property = JSONObject.Property( name: propertyName, comment: propertySchema.description, type: try transformSchemaToAnyType(propertySchema, named: propertyName), @@ -105,17 +105,20 @@ internal class JSONSchemaToJSONTypeTransformer { case .string(let value): return .string(value: value) } }, - isRequired: isRequired ?? schema.required?.contains(propertyName) ?? Defaults.isRequired, + isRequired: schema.required?.contains(propertyName) ?? Defaults.isRequired, isReadOnly: propertySchema.readOnly ?? Defaults.isReadOnly ) + properties.append(property) } - try propertiesByName.forEach { properties.append(try property(from: $1, $0)) } - - let additionalProperties: JSONObject.Property? + let additionalProperties: JSONObject.AdditionalProperties? if let additionalPropertiesSchema = schema.additionalProperties { - let propName = JSONSchema.CodingKeys.additionalProperties.rawValue - additionalProperties = try property(from: additionalPropertiesSchema, propName, false) + let type = try transformSchemaToPrimitive(additionalPropertiesSchema) + additionalProperties = JSONObject.AdditionalProperties( + comment: additionalPropertiesSchema.description, + type: type, + isReadOnly: additionalPropertiesSchema.readOnly ?? Defaults.isReadOnly + ) } else { additionalProperties = nil } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift index 1cc1a01c02..9648cd00e4 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/JSON/JSONType.swift @@ -41,12 +41,18 @@ internal struct JSONObject: JSONType { let isReadOnly: Bool } + struct AdditionalProperties: JSONType { + let comment: String? + let type: JSONPrimitive + let isReadOnly: Bool + } + let name: String let comment: String? let properties: [Property] - let additionalProperties: Property? + let additionalProperties: AdditionalProperties? - init(name: String, comment: String?, properties: [Property], additionalProperties: Property? = nil) { + init(name: String, comment: String?, properties: [Property], additionalProperties: AdditionalProperties? = nil) { self.name = name self.comment = comment self.properties = properties.sorted { property1, property2 in property1.name < property2.name } diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift index cb3d9eac36..356f3cbf67 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/ObjcInterop/SwiftToObjcInteropTypeTransformer.swift @@ -78,17 +78,13 @@ internal class SwiftToObjcInteropTypeTransformer { ) propertyWrapper.objcInteropType = try objcInteropType(for: swiftArray) return propertyWrapper - case let swiftDictionary as SwiftDictionary where swiftDictionary.value is SwiftPrimitiveType: + case let swiftDictionary as SwiftDictionary: let propertyWrapper = ObjcInteropPropertyWrapperManagingSwiftStructProperty( owner: objcClass, swiftProperty: swiftProperty ) propertyWrapper.objcInteropType = try objcInteropType(for: swiftDictionary) return propertyWrapper - case let swiftDictionary as SwiftDictionary where swiftDictionary.key is SwiftEnum || swiftDictionary.value is SwiftEnum: - throw Exception.unimplemented( - "Objc Interop for `SwiftDictionary`s with an Enum as key or value is not supported." - ) case let swifTypeReference as SwiftTypeReference: let referencedType = try resolve(swiftTypeReference: swifTypeReference) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift index b4e8862ad9..3f7579537b 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/JSONToSwiftTypeTransformer.swift @@ -70,8 +70,7 @@ internal class JSONToSwiftTypeTransformer { throw Exception.unimplemented("Transforming \(jsonObject) with both `properties` and `additionalProperties` is not supported.") } return SwiftDictionary( - key: SwiftPrimitive(), - value: try transformJSONToAnyType(additionalProperties.type) + value: transformJSONtoPrimitive(additionalProperties.type) ) } else { return try transformJSONToStruct(jsonObject) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift index e90ee7500a..183284080d 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Input/Swift/SwiftType.swift @@ -29,8 +29,8 @@ internal struct SwiftArray: SwiftType { } internal struct SwiftDictionary: SwiftType { - var key: SwiftType - var value: SwiftType + let key = SwiftPrimitive() + var value: SwiftPrimitiveType } internal struct SwiftEnum: SwiftType { diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift index 3b787ec5d8..504f7838f5 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/ObjcInteropPrinter.swift @@ -357,8 +357,7 @@ internal class ObjcInteropPrinter: BasePrinter { .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftArray` with elements of type: \(type(of: swiftArray.element))")) return ".map { $0\(elementCast) }" case let swiftDictionary as SwiftDictionary: - let keyCast = try objcToSwiftCast(for: swiftDictionary.key) - .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftDictionary` with keys of type: \(type(of: swiftDictionary.key))")) + let keyCast = try objcToSwiftCast(for: swiftDictionary.key) ?? "" let valueCast = try objcToSwiftCast(for: swiftDictionary.value) .unwrapOrThrow(.illegal("Cannot print `objcToSwiftCast()` for `SwiftDictionary` with values of type: \(type(of: swiftDictionary.value))")) return ".reduce(into: [:]) { $0[$1.0\(keyCast)] = $1.1\(valueCast)" diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift index 596c0f003d..e4de4a81e2 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/Output/Printing/SwiftPrinter.swift @@ -92,8 +92,8 @@ public class SwiftPrinter: BasePrinter { private func printNestedTypes(in swiftStruct: SwiftStruct) throws { let nestedTypes = swiftStruct.properties.map { $0.type } try nestedTypes.forEach { type in - let nestedStruct = (type as? SwiftStruct) ?? ((type as? SwiftArray)?.element as? SwiftStruct) ?? ((type as? SwiftDictionary)?.value as? SwiftStruct) - let nestedEnum = (type as? SwiftEnum) ?? ((type as? SwiftArray)?.element as? SwiftEnum) ?? ((type as? SwiftDictionary)?.value as? SwiftEnum) + let nestedStruct = (type as? SwiftStruct) ?? ((type as? SwiftArray)?.element as? SwiftStruct) + let nestedEnum = (type as? SwiftEnum) ?? ((type as? SwiftArray)?.element as? SwiftEnum) if let nestedStruct = nestedStruct { writeEmptyLine() diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index 8d2a3b01d6..d6a2928ee0 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -36,7 +36,7 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { case let array as SwiftArray: return try transform(array: array) case let dictionary as SwiftDictionary: - return try transform(dictionary: dictionary) + return transform(dictionary: dictionary) case let `enum` as SwiftEnum: let transformed = transform(enum: `enum`) return isSharedType(transformed) ? try replaceWithSharedTypeReference(transformed) : transformed @@ -56,9 +56,9 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { } } - private func transform(dictionary: SwiftDictionary) throws -> SwiftDictionary { + private func transform(dictionary: SwiftDictionary) -> SwiftDictionary { var dictionary = dictionary - dictionary.value = try transformAny(type: dictionary.value) + dictionary.value = transform(primitive: dictionary.value) return dictionary } diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift index b4353dab00..8a25b7fc1d 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONSchemaToJSONTypeTransformerTests.swift @@ -164,12 +164,9 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { comment: "Description of a property with nested additional properties.", properties: [], additionalProperties: - JSONObject.Property( - name: "additionalProperties", + JSONObject.AdditionalProperties( comment: nil, type: JSONPrimitive.integer, - defaultValue: nil, - isRequired: false, isReadOnly: true ) ), @@ -178,12 +175,9 @@ final class JSONSchemaToJSONTypeTransformerTests: XCTestCase { isReadOnly: true ) ], - additionalProperties: JSONObject.Property( - name: "additionalProperties", + additionalProperties: JSONObject.AdditionalProperties( comment: "Additional properties of Foo.", type: JSONPrimitive.string, - defaultValue: nil, - isRequired: false, isReadOnly: true ) ) diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift index f31ade3827..f0d1e83473 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Input/JSONToSwiftTypeTransformerTests.swift @@ -171,18 +171,15 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { comment: "Description of a property with nested additional properties.", properties: [], additionalProperties: - JSONObject.Property( - name: "additionalProperties", + JSONObject.AdditionalProperties( comment: nil, type: JSONPrimitive.integer, - defaultValue: nil, - isRequired: false, - isReadOnly: true // how to reconcile with additionalProperties's required/readOnly? + isReadOnly: true ) ), defaultValue: nil, isRequired: false, - isReadOnly: true // how to reconcile with additionalProperties's required/readOnly? + isReadOnly: true ) ] ) @@ -194,10 +191,7 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { SwiftStruct.Property( name: "propertyWithAdditionalProperties", comment: "Description of a property with nested additional properties.", - type: SwiftDictionary( - key: SwiftPrimitive(), - value: SwiftPrimitive() - ), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, @@ -234,12 +228,9 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { isReadOnly: true ) ], - additionalProperties: JSONObject.Property( - name: "additionalProperties", + additionalProperties: JSONObject.AdditionalProperties( comment: "Additional properties of property1.", type: JSONPrimitive.string, - defaultValue: nil, - isRequired: false, isReadOnly: true ) ), @@ -283,12 +274,9 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { isReadOnly: true ) ], - additionalProperties: JSONObject.Property( - name: "additionalProperties", + additionalProperties: JSONObject.AdditionalProperties( comment: "Additional properties of Foo.", type: JSONPrimitive.string, - defaultValue: nil, - isRequired: false, isReadOnly: true ) ) @@ -312,12 +300,9 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { comment: "Description of a property with nested additional properties.", properties: [], additionalProperties: - JSONObject.Property( - name: "additionalProperties", + JSONObject.AdditionalProperties( comment: nil, type: JSONPrimitive.integer, - defaultValue: nil, - isRequired: false, isReadOnly: false ) ), @@ -336,7 +321,6 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { name: "propertyWithAdditionalProperties", comment: "Description of a property with nested additional properties.", type: SwiftDictionary( - key: SwiftPrimitive(), value: SwiftPrimitive() ), isOptional: false, diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift index cfdd95f3d7..b9903f1b13 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/ObjcInteropPrinterTests.swift @@ -967,25 +967,25 @@ final class ObjcInteropPrinterTests: XCTestCase { properties: [ .mock( propertyName: "immutableStrings", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: false, isMutable: false ), .mock( propertyName: "optionalImmutableStrings", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: false ), .mock( propertyName: "mutableStrings", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: false, isMutable: true ), .mock( propertyName: "optionalMutableStrings", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: true ), @@ -1050,25 +1050,25 @@ final class ObjcInteropPrinterTests: XCTestCase { properties: [ .mock( propertyName: "immutableInt64s", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: false, isMutable: false ), .mock( propertyName: "optionalImmutableInt64s", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: false ), .mock( propertyName: "mutableInt64s", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: false, isMutable: true ), .mock( propertyName: "optionalMutableInt64s", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: true ), @@ -1080,13 +1080,13 @@ final class ObjcInteropPrinterTests: XCTestCase { // MARK: - Swift public struct Foo { - public let immutableInt64s: [Int64: Int64] + public let immutableInt64s: [String: Int64] - public let optionalImmutableInt64s: [Int64: Int64]? + public let optionalImmutableInt64s: [String: Int64]? - public var mutableInt64s: [Int64: Int64] + public var mutableInt64s: [String: Int64] - public var optionalMutableInt64s: [Int64: Int64]? + public var optionalMutableInt64s: [String: Int64]? } // MARK: - ObjcInterop @@ -1100,22 +1100,22 @@ final class ObjcInteropPrinterTests: XCTestCase { self.swiftModel = swiftModel } - @objc public var immutableInt64s: [NSNumber: NSNumber] { - root.swiftModel.immutableInt64s as [NSNumber: NSNumber] + @objc public var immutableInt64s: [String: NSNumber] { + root.swiftModel.immutableInt64s as [String: NSNumber] } - @objc public var optionalImmutableInt64s: [NSNumber: NSNumber]? { - root.swiftModel.optionalImmutableInt64s as [NSNumber: NSNumber]? + @objc public var optionalImmutableInt64s: [String: NSNumber]? { + root.swiftModel.optionalImmutableInt64s as [String: NSNumber]? } - @objc public var mutableInt64s: [NSNumber: NSNumber] { - set { root.swiftModel.mutableInt64s = newValue.reduce(into: [:]) { $0[$1.0.int64Value] = $1.1.int64Value } - get { root.swiftModel.mutableInt64s as [NSNumber: NSNumber] } + @objc public var mutableInt64s: [String: NSNumber] { + set { root.swiftModel.mutableInt64s = newValue.reduce(into: [:]) { $0[$1.0] = $1.1.int64Value } + get { root.swiftModel.mutableInt64s as [String: NSNumber] } } - @objc public var optionalMutableInt64s: [NSNumber: NSNumber]? { - set { root.swiftModel.optionalMutableInt64s = newValue?.reduce(into: [:]) { $0[$1.0.int64Value] = $1.1.int64Value } - get { root.swiftModel.optionalMutableInt64s as [NSNumber: NSNumber]? } + @objc public var optionalMutableInt64s: [String: NSNumber]? { + set { root.swiftModel.optionalMutableInt64s = newValue?.reduce(into: [:]) { $0[$1.0] = $1.1.int64Value } + get { root.swiftModel.optionalMutableInt64s as [String: NSNumber]? } } } @@ -1126,58 +1126,6 @@ final class ObjcInteropPrinterTests: XCTestCase { XCTAssertEqual(expected, actual) } - func testPrintingObjcInteropForSwiftStructWithEnumDictionaryProperties() throws { - func mockEnumeration(named name: String) -> SwiftEnum { - return SwiftEnum( - name: name, - comment: nil, - cases: [ - SwiftEnum.Case(label: "option1", rawValue: "option1"), - SwiftEnum.Case(label: "option2", rawValue: "option2"), - SwiftEnum.Case(label: "option3", rawValue: "option3"), - ], - conformance: [] - ) - } - - let fooStruct = SwiftStruct( - name: "Foo", - comment: nil, - properties: [ - .mock( - propertyName: "immutableEnums", - type: SwiftDictionary(key: SwiftPrimitive(), value: mockEnumeration(named: "Options1")), - isOptional: false, - isMutable: false - ), - .mock( - propertyName: "optionalImmutableEnums", - type:SwiftDictionary(key: SwiftPrimitive(), value: mockEnumeration(named: "Options2")), - isOptional: true, - isMutable: false - ), - .mock( - propertyName: "immutableEnumKeys", - type: SwiftDictionary(key: mockEnumeration(named: "Options1"), value: SwiftPrimitive()), - isOptional: false, - isMutable: false - ), - .mock( - propertyName: "optionalImmutableEnumKeys", - type: SwiftDictionary(key: mockEnumeration(named: "Options1"), value: SwiftPrimitive()), - isOptional: true, - isMutable: false - ), - ], - conformance: [] - ) - - var error: Error? = nil - XCTAssertThrowsError(try printSwiftWithObjcInterop(for: [fooStruct])) { error = $0 } - let exception = try XCTUnwrap(error as? Exception) - XCTAssertTrue(exception.description.contains("not supported")) - } - // MARK: - Nested Swift Structs and Enums func testPrintingObjcInteropForSwiftStructWithNestedStructs() throws { diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift index 08778a54ab..8e1315b732 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/Output/SwiftPrinterTests.swift @@ -88,7 +88,7 @@ final class SwiftPrinterTests: XCTestCase { SwiftStruct.Property( name: "propertiesByNames", comment: "Description of FooBar's `propertiesByNames`.", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: false, defaultValue: nil, diff --git a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift index 9c8742a10b..4bac2408da 100644 --- a/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/rum-models-generator-coreTests/RUM/RUMSwiftTypeTransformerTests.swift @@ -89,7 +89,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { SwiftStruct.Property( name: "propertiesByNames", comment: "Description of Foobar's `propertiesByNames`", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: true, defaultValue: nil, @@ -182,7 +182,7 @@ final class RUMSwiftTypeTransformerTests: XCTestCase { SwiftStruct.Property( name: "propertiesByNames", comment: "Description of Foobar's `propertiesByNames`", - type: SwiftDictionary(key: SwiftPrimitive(), value: SwiftPrimitive()), + type: SwiftDictionary(value: SwiftPrimitive()), isOptional: true, isMutable: true, defaultValue: nil, From 423f095eb6765f0a18e89d8e1a41e0322196d84e Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Mon, 8 Feb 2021 15:24:10 +0100 Subject: [PATCH 20/36] RUMM-1000 Remove filter on customTimings in RUM SwiftTypes Transformer --- .../RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift index d6a2928ee0..62a1a83c3a 100644 --- a/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/RUMModelsGeneratorCore/RUM/RUMSwiftTypeTransformer.swift @@ -104,8 +104,6 @@ internal class RUMSwiftTypeTransformer: TypeTransformer { `struct`.name = format(structName: `struct`.name) `struct`.properties = try `struct`.properties .map { try transform(structProperty: $0) } - // TODO: RUMM-1000 should remove this filter - .filter { property in property.name != "customTimings" } if context.parent == nil { `struct`.conformance = [rumDataModelProtocol] // Conform root structs to `RUMDataModel` } else { From 8b70eabfdcafa54b13e851ae79753f9aecab0a21 Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Mon, 8 Feb 2021 15:27:10 +0100 Subject: [PATCH 21/36] RUMM-1000 Run rum-models-generator and generate customTimings and name for the View model --- .../RUM/DataModels/RUMDataModels.swift | 22 +++++++++++++++- .../DatadogObjc/RUM/RUMDataModels+objc.swift | 26 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Sources/Datadog/RUM/DataModels/RUMDataModels.swift b/Sources/Datadog/RUM/DataModels/RUMDataModels.swift index 717c2c1a6a..83895fad2b 100644 --- a/Sources/Datadog/RUM/DataModels/RUMDataModels.swift +++ b/Sources/Datadog/RUM/DataModels/RUMDataModels.swift @@ -108,6 +108,9 @@ public struct RUMViewEvent: RUMDataModel { /// Total layout shift score that occured on the view public let cumulativeLayoutShift: Double? + /// User custom timings of the view. As timing name is used as facet path, it must contain only letters, digits, or the characters - _ . @ $ + public let customTimings: [String: Int64]? + /// Duration in ns to the complete parsing and loading of the document and its sub resources public let domComplete: Int64? @@ -150,6 +153,9 @@ public struct RUMViewEvent: RUMDataModel { /// Properties of the long tasks of the view public let longTask: LongTask? + /// User defined name of the view + public var name: String? + /// URL that linked to the initial view of the page public var referrer: String? @@ -166,6 +172,7 @@ public struct RUMViewEvent: RUMDataModel { case action = "action" case crash = "crash" case cumulativeLayoutShift = "cumulative_layout_shift" + case customTimings = "custom_timings" case domComplete = "dom_complete" case domContentLoaded = "dom_content_loaded" case domInteractive = "dom_interactive" @@ -180,6 +187,7 @@ public struct RUMViewEvent: RUMDataModel { case loadingTime = "loading_time" case loadingType = "loading_type" case longTask = "long_task" + case name = "name" case referrer = "referrer" case resource = "resource" case timeSpent = "time_spent" @@ -562,6 +570,9 @@ public struct RUMResourceEvent: RUMDataModel { /// UUID of the view public let id: String + /// User defined name of the view + public var name: String? + /// URL that linked to the initial view of the page public var referrer: String? @@ -570,6 +581,7 @@ public struct RUMResourceEvent: RUMDataModel { enum CodingKeys: String, CodingKey { case id = "id" + case name = "name" case referrer = "referrer" case url = "url" } @@ -769,6 +781,9 @@ public struct RUMActionEvent: RUMDataModel { /// UUID of the view public let id: String + /// User defined name of the view + public var name: String? + /// URL that linked to the initial view of the page public var referrer: String? @@ -777,6 +792,7 @@ public struct RUMActionEvent: RUMDataModel { enum CodingKeys: String, CodingKey { case id = "id" + case name = "name" case referrer = "referrer" case url = "url" } @@ -990,6 +1006,9 @@ public struct RUMErrorEvent: RUMDataModel { /// UUID of the view public let id: String + /// User defined name of the view + public var name: String? + /// URL that linked to the initial view of the page public var referrer: String? @@ -998,6 +1017,7 @@ public struct RUMErrorEvent: RUMDataModel { enum CodingKeys: String, CodingKey { case id = "id" + case name = "name" case referrer = "referrer" case url = "url" } @@ -1083,4 +1103,4 @@ public enum RUMMethod: String, Codable { case patch = "PATCH" } -// Generated from https://github.com/DataDog/rum-events-format/tree/8b955a03d0fe0b2f032a02d6800c61ef3fc9fada +// Generated from https://github.com/DataDog/rum-events-format/tree/a37c41a4ac1aa3bfdc8d1fcecb35e4d1e07adddc diff --git a/Sources/DatadogObjc/RUM/RUMDataModels+objc.swift b/Sources/DatadogObjc/RUM/RUMDataModels+objc.swift index 47133619fa..0bde95fa8d 100644 --- a/Sources/DatadogObjc/RUM/RUMDataModels+objc.swift +++ b/Sources/DatadogObjc/RUM/RUMDataModels+objc.swift @@ -271,6 +271,10 @@ public class DDRUMViewEventView: NSObject { root.swiftModel.view.cumulativeLayoutShift as NSNumber? } + @objc public var customTimings: [String: NSNumber]? { + root.swiftModel.view.customTimings as [String: NSNumber]? + } + @objc public var domComplete: NSNumber? { root.swiftModel.view.domComplete as NSNumber? } @@ -327,6 +331,11 @@ public class DDRUMViewEventView: NSObject { root.swiftModel.view.longTask != nil ? DDRUMViewEventViewLongTask(root: root) : nil } + @objc public var name: String? { + set { root.swiftModel.view.name = newValue } + get { root.swiftModel.view.name } + } + @objc public var referrer: String? { set { root.swiftModel.view.referrer = newValue } get { root.swiftModel.view.referrer } @@ -1056,6 +1065,11 @@ public class DDRUMResourceEventView: NSObject { root.swiftModel.view.id } + @objc public var name: String? { + set { root.swiftModel.view.name = newValue } + get { root.swiftModel.view.name } + } + @objc public var referrer: String? { set { root.swiftModel.view.referrer = newValue } get { root.swiftModel.view.referrer } @@ -1461,6 +1475,11 @@ public class DDRUMActionEventView: NSObject { root.swiftModel.view.id } + @objc public var name: String? { + set { root.swiftModel.view.name = newValue } + get { root.swiftModel.view.name } + } + @objc public var referrer: String? { set { root.swiftModel.view.referrer = newValue } get { root.swiftModel.view.referrer } @@ -1949,6 +1968,11 @@ public class DDRUMErrorEventView: NSObject { root.swiftModel.view.id } + @objc public var name: String? { + set { root.swiftModel.view.name = newValue } + get { root.swiftModel.view.name } + } + @objc public var referrer: String? { set { root.swiftModel.view.referrer = newValue } get { root.swiftModel.view.referrer } @@ -1962,4 +1986,4 @@ public class DDRUMErrorEventView: NSObject { // swiftlint:enable force_unwrapping -// Generated from https://github.com/DataDog/rum-events-format/tree/8b955a03d0fe0b2f032a02d6800c61ef3fc9fada +// Generated from https://github.com/DataDog/rum-events-format/tree/a37c41a4ac1aa3bfdc8d1fcecb35e4d1e07adddc From 4f9ef0887e029cec14509bfa9af1d3cb0a9f659c Mon Sep 17 00:00:00 2001 From: Xavier Gouchet Date: Mon, 8 Feb 2021 19:17:53 +0100 Subject: [PATCH 22/36] RUMM-1018 Create a dogfooding script --- dogfood.py | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 dogfood.py diff --git a/dogfood.py b/dogfood.py new file mode 100755 index 0000000000..1bd38766cd --- /dev/null +++ b/dogfood.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc + +import re +import subprocess +import sys +import os +from argparse import ArgumentParser, Namespace +from tempfile import TemporaryDirectory +from typing import Tuple + +import requests +from git import Repo + +TARGET_APP = "app" +TARGET_DEMO = "demo" + +REPOSITORIES = {TARGET_APP: "datadog-ios", TARGET_DEMO: "shopist-ios"} + + +def parse_arguments(args: list) -> Namespace: + parser = ArgumentParser() + + parser.add_argument("-v", "--version", required=True, help="the version of the SDK") + parser.add_argument("-t", "--target", required=True, + choices=[TARGET_APP, TARGET_DEMO], + help="the target repository") + + return parser.parse_args(args) + + +def github_create_pr(repository: str, branch_name: str, base_name: str, version: str, gh_token: str) -> int: + headers = { + 'authorization': "Bearer " + gh_token, + 'Accept': 'application/vnd.github.v3+json', + } + data = '{"body": "This PR has been created automatically by the CI", ' \ + '"title": "Update to version ' + version + '", ' \ + '"base":"' + base_name + '", "head":"' + branch_name + '"}' + + url = "https://api.github.com/repos/DataDog/" + repository + "/pulls" + response = requests.post(url=url, headers=headers, data=data) + if response.status_code == 201: + print("✔ Pull Request created successfully") + return 0 + else: + print("✘ pull request failed " + str(response.status_code) + '\n' + response.text) + return 1 + + +def generate_target_code(target: str, temp_dir_path: str, version: str): + print("… Generating code with version " + version) + + if target == TARGET_APP: + target_file = os.path.join(temp_dir_path, "Podfile") + content = "" + with open(target_file, 'r') as target: + lines = target.readlines() + for line in lines: + if "pod 'DatadogSDK'" in line: + content = content + " pod 'DatadogSDK', :git => 'https://github.com/DataDog/dd-sdk-ios.git', :tag => '" + version + "'\n" + else: + content = content + line + + with open(target_file, 'w') as target: + target.write(content) + + target_file = os.path.join(temp_dir_path, "Podfile.lock") + content = "" + with open(target_file, 'r') as target: + lines = target.readlines() + for line in lines: + if " - DatadogSDK (from " in line: + content = content + " - DatadogSDK (from `https://github.com/DataDog/dd-sdk-ios.git`, tag `" + version + "`)\n" + elif " - DatadogSDK (" in line: + content = content + " - DatadogSDK (" + version + ")\n" + else: + content = content + line + + with open(target_file, 'w') as target: + target.write(content) + + # TODO RUMM-1063 elif target == TARGET_DEMO: … + + +def git_clone_repository(repo_name: str, gh_token: str, temp_dir_path: str) -> Tuple[Repo, str]: + print("… Cloning repository " + repo_name) + url = "https://" + gh_token + ":x-oauth-basic@github.com/DataDog/" + repo_name + repo = Repo.clone_from(url, temp_dir_path) + base_name = repo.active_branch.name + return repo, base_name + + +def git_push_changes(repo: Repo, version: str): + print("… Committing changes") + repo.git.add(update=True) + repo.index.commit("Update DD SDK to " + version) + + print("⑊ Pushing branch") + origin = repo.remote(name="origin") + repo.git.push("--set-upstream", "--force", origin, repo.head.ref) + + +def update_dependant(version: str, target: str, gh_token: str) -> int: + branch_name = "update_sdk_" + version + temp_dir = TemporaryDirectory() + temp_dir_path = temp_dir.name + repo_name = REPOSITORIES[target] + + repo, base_name = git_clone_repository(repo_name, gh_token, temp_dir_path) + + print("… Creating branch " + branch_name) + repo.git.checkout('HEAD', b=branch_name) + + generate_target_code(target, temp_dir_path, version) + + if not repo.is_dirty(): + print("∅ Nothing to commit, all is in order…") + return 0 + + git_push_changes(repo, version) + + return github_create_pr(repo_name, branch_name, base_name, version, gh_token) + +def run_main() -> int: + cli_args = parse_arguments(sys.argv[1:]) + + if cli_args.target != TARGET_APP: + print("Cannot dogfood target : " + cli_args.target) + return 1 + + # This script expects to have a valid Github Token in a "gh_token" text file + # The token needs the `repo` permissions, and for now is a PAT + with open('gh_token', 'r') as f: + gh_token = f.read().strip() + + return update_dependant(cli_args.version, cli_args.target, gh_token) + + +if __name__ == "__main__": + sys.exit(run_main()) From d829781ff716ecff315bfa89b9bffc3582cd6c0e Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Mon, 8 Feb 2021 15:47:21 +0100 Subject: [PATCH 23/36] RUMM-1000 Remove RUMEvent.customViewTimings + the related workarounds and use View.customTimings instead --- Sources/Datadog/Core/Utils/JSONEncoder.swift | 21 --------- .../RUM/RUMEvent/RUMEventBuilder.swift | 6 +-- .../RUM/RUMEvent/RUMEventEncoder.swift | 6 --- .../RUM/RUMEvent/RUMEventSanitizer.swift | 14 ++---- .../RUM/RUMMonitor/Scopes/RUMViewScope.swift | 3 +- .../Datadog/Mocks/RUMDataModelMocks.swift | 1 + .../Datadog/Mocks/RUMFeatureMocks.swift | 23 +++++----- .../SystemFrameworks/FoundationMocks.swift | 42 ++++++++++++----- .../RUM/RUMEvent/RUMEventSanitizerTests.swift | 45 +++---------------- .../RUMMonitor/Scopes/RUMViewScopeTests.swift | 8 ++-- .../RUM/Scrubbing/RUMEventsMapperTests.swift | 4 -- 11 files changed, 57 insertions(+), 116 deletions(-) diff --git a/Sources/Datadog/Core/Utils/JSONEncoder.swift b/Sources/Datadog/Core/Utils/JSONEncoder.swift index ebb45e79bb..37c9e5a52f 100644 --- a/Sources/Datadog/Core/Utils/JSONEncoder.swift +++ b/Sources/Datadog/Core/Utils/JSONEncoder.swift @@ -14,27 +14,6 @@ extension JSONEncoder { let formatted = iso8601DateFormatter.string(from: date) try container.encode(formatted) } - if #available(iOS 13.0, OSX 10.15, *) { - // NOTE: The `.sortedKeys` option was added in RUMM-776 after discovering an issue - // with backend processing of the RUM View payloads. The custom timings encoding for - // RUM views requires following structure: - // - // ``` - // { - // view: { /* serialized, auto-generated RUM view event */ }, - // view.custom_timings.: , - // view.custom_timings.: - // ... - // } - // ``` - // - // To guarantee proper backend-side processing, the `view.custom_timings` keys must be - // encoded after the `view` object. Using `.sortedKeys` enforces this order. - // - encoder.outputFormatting = [.withoutEscapingSlashes, .sortedKeys] - } else { - encoder.outputFormatting = [.sortedKeys] - } return encoder } } diff --git a/Sources/Datadog/RUM/RUMEvent/RUMEventBuilder.swift b/Sources/Datadog/RUM/RUMEvent/RUMEventBuilder.swift index eefbd566d6..8f1f5c9253 100644 --- a/Sources/Datadog/RUM/RUMEvent/RUMEventBuilder.swift +++ b/Sources/Datadog/RUM/RUMEvent/RUMEventBuilder.swift @@ -15,14 +15,12 @@ internal class RUMEventBuilder { func createRUMEvent( with model: DM, - attributes: [String: Encodable], - customTimings: [String: Int64]? = nil + attributes: [String: Encodable] ) -> RUMEvent { return RUMEvent( model: model, attributes: attributes, - userInfoAttributes: userInfoProvider.value.extraInfo, - customViewTimings: customTimings + userInfoAttributes: userInfoProvider.value.extraInfo ) } } diff --git a/Sources/Datadog/RUM/RUMEvent/RUMEventEncoder.swift b/Sources/Datadog/RUM/RUMEvent/RUMEventEncoder.swift index 1f1858d20e..b86630d4c7 100644 --- a/Sources/Datadog/RUM/RUMEvent/RUMEventEncoder.swift +++ b/Sources/Datadog/RUM/RUMEvent/RUMEventEncoder.swift @@ -16,9 +16,6 @@ internal struct RUMEvent: Encodable { var attributes: [String: Encodable] var userInfoAttributes: [String: Encodable] - /// Custom View timings (only available if `DM` is a RUM View model) - var customViewTimings: [String: Int64]? - func encode(to encoder: Encoder) throws { let sanitizedEvent = RUMEventSanitizer().sanitize(event: self) try RUMEventEncoder().encode(sanitizedEvent, to: encoder) @@ -45,9 +42,6 @@ internal struct RUMEventEncoder { try event.userInfoAttributes.forEach { attributeName, attributeValue in try attributesContainer.encode(EncodableValue(attributeValue), forKey: DynamicCodingKey("context.usr.\(attributeName)")) } - try event.customViewTimings?.forEach { timingName, timingDuration in - try attributesContainer.encode(timingDuration, forKey: DynamicCodingKey("view.custom_timings.\(timingName)")) - } // Encode `RUMDataModel` try event.model.encode(to: encoder) diff --git a/Sources/Datadog/RUM/RUMEvent/RUMEventSanitizer.swift b/Sources/Datadog/RUM/RUMEvent/RUMEventSanitizer.swift index 4f1cac7009..a94888b6b2 100644 --- a/Sources/Datadog/RUM/RUMEvent/RUMEventSanitizer.swift +++ b/Sources/Datadog/RUM/RUMEvent/RUMEventSanitizer.swift @@ -12,32 +12,24 @@ internal struct RUMEventSanitizer { func sanitize(event: RUMEvent) -> RUMEvent { // Sanitize attribute names - var sanitizedTimings = event.customViewTimings.flatMap { attributesSanitizer.sanitizeKeys(for: $0) } var sanitizedUserExtraInfo = attributesSanitizer.sanitizeKeys(for: event.userInfoAttributes) var sanitizedAttributes = attributesSanitizer.sanitizeKeys(for: event.attributes) // Limit to max number of attributes. // If any attributes need to be removed, we first reduce number of - // event attributes, then user info extra attributes, then custom timings. - sanitizedTimings = sanitizedTimings.flatMap { timings in - attributesSanitizer.limitNumberOf( - attributes: timings, - to: AttributesSanitizer.Constraints.maxNumberOfAttributes - ) - } + // event attributes, then user info extra attributes. sanitizedUserExtraInfo = attributesSanitizer.limitNumberOf( attributes: sanitizedUserExtraInfo, - to: AttributesSanitizer.Constraints.maxNumberOfAttributes - (sanitizedTimings?.count ?? 0) + to: AttributesSanitizer.Constraints.maxNumberOfAttributes ) sanitizedAttributes = attributesSanitizer.limitNumberOf( attributes: sanitizedAttributes, - to: AttributesSanitizer.Constraints.maxNumberOfAttributes - (sanitizedTimings?.count ?? 0) - sanitizedUserExtraInfo.count + to: AttributesSanitizer.Constraints.maxNumberOfAttributes - sanitizedUserExtraInfo.count ) var sanitizedEvent = event sanitizedEvent.attributes = sanitizedAttributes sanitizedEvent.userInfoAttributes = sanitizedUserExtraInfo - sanitizedEvent.customViewTimings = sanitizedTimings return sanitizedEvent } } diff --git a/Sources/Datadog/RUM/RUMMonitor/Scopes/RUMViewScope.swift b/Sources/Datadog/RUM/RUMMonitor/Scopes/RUMViewScope.swift index a94f399835..bd5903764c 100644 --- a/Sources/Datadog/RUM/RUMMonitor/Scopes/RUMViewScope.swift +++ b/Sources/Datadog/RUM/RUMMonitor/Scopes/RUMViewScope.swift @@ -270,6 +270,7 @@ internal class RUMViewScope: RUMScope, RUMContextProvider { action: .init(count: actionsCount.toInt64), crash: nil, cumulativeLayoutShift: nil, + customTimings: customTimings, domComplete: nil, domContentLoaded: nil, domInteractive: nil, @@ -291,7 +292,7 @@ internal class RUMViewScope: RUMScope, RUMContextProvider { ) ) - let event = dependencies.eventBuilder.createRUMEvent(with: eventData, attributes: attributes, customTimings: customTimings) + let event = dependencies.eventBuilder.createRUMEvent(with: eventData, attributes: attributes) dependencies.eventOutput.write(rumEvent: event) } diff --git a/Tests/DatadogTests/Datadog/Mocks/RUMDataModelMocks.swift b/Tests/DatadogTests/Datadog/Mocks/RUMDataModelMocks.swift index 9a58bfc262..a0a15effb3 100644 --- a/Tests/DatadogTests/Datadog/Mocks/RUMDataModelMocks.swift +++ b/Tests/DatadogTests/Datadog/Mocks/RUMDataModelMocks.swift @@ -60,6 +60,7 @@ extension RUMViewEvent { action: .init(count: .mockRandom()), crash: .init(count: .mockRandom()), cumulativeLayoutShift: .mockRandom(), + customTimings: .mockAny(), domComplete: .mockRandom(), domContentLoaded: .mockRandom(), domInteractive: .mockRandom(), diff --git a/Tests/DatadogTests/Datadog/Mocks/RUMFeatureMocks.swift b/Tests/DatadogTests/Datadog/Mocks/RUMFeatureMocks.swift index 6e7ff86b73..7070bfcc18 100644 --- a/Tests/DatadogTests/Datadog/Mocks/RUMFeatureMocks.swift +++ b/Tests/DatadogTests/Datadog/Mocks/RUMFeatureMocks.swift @@ -88,14 +88,12 @@ extension RUMEvent { static func mockWith( model: DM, attributes: [String: Encodable] = [:], - userInfoAttributes: [String: Encodable] = [:], - customViewTimings: [String: Int64]? = nil + userInfoAttributes: [String: Encodable] = [:] ) -> RUMEvent { return RUMEvent( model: model, attributes: attributes, - userInfoAttributes: userInfoAttributes, - customViewTimings: customViewTimings + userInfoAttributes: userInfoAttributes ) } @@ -106,17 +104,10 @@ extension RUMEvent { return attributes } - func randomTimings() -> [String: Int64] { - var timings: [String: Int64] = [:] - (0..<10).forEach { index in timings["timing\(index)"] = .mockRandom() } - return timings - } - return RUMEvent( model: model, attributes: randomAttributes(prefixed: "event-attribute"), - userInfoAttributes: randomAttributes(prefixed: "user-attribute"), - customViewTimings: randomTimings() + userInfoAttributes: randomAttributes(prefixed: "user-attribute") ) } } @@ -502,13 +493,19 @@ extension RUMViewScope { return mockWith() } + static func randomTimings() -> [String: Int64] { + var timings: [String: Int64] = [:] + (0..<10).forEach { index in timings["timing\(index)"] = .mockRandom() } + return timings + } + static func mockWith( parent: RUMContextProvider = RUMContextProviderMock(), dependencies: RUMScopeDependencies = .mockAny(), identity: RUMViewIdentifiable = mockView, uri: String = .mockAny(), attributes: [AttributeKey: AttributeValue] = [:], - customTimings: [String: Int64] = [:], + customTimings: [String: Int64] = randomTimings(), startTime: Date = .mockAny() ) -> RUMViewScope { return RUMViewScope( diff --git a/Tests/DatadogTests/Datadog/Mocks/SystemFrameworks/FoundationMocks.swift b/Tests/DatadogTests/Datadog/Mocks/SystemFrameworks/FoundationMocks.swift index bd16b1f698..0a3f137434 100644 --- a/Tests/DatadogTests/Datadog/Mocks/SystemFrameworks/FoundationMocks.swift +++ b/Tests/DatadogTests/Datadog/Mocks/SystemFrameworks/FoundationMocks.swift @@ -33,7 +33,15 @@ import Foundation // MARK: - Basic types -extension Data { +protocol AnyMockable { + static func mockAny() -> Self +} + +protocol RandomMockable { + static func mockRandom() -> Self +} + +extension Data: AnyMockable { static func mockAny() -> Data { return Data() } @@ -71,7 +79,13 @@ extension Array { } } -extension Date { +extension Dictionary: AnyMockable where Key: AnyMockable, Value: AnyMockable { + static func mockAny() -> Dictionary { + return [Key.mockAny(): Value.mockAny()] + } +} + +extension Date: AnyMockable { static func mockAny() -> Date { return Date(timeIntervalSinceReferenceDate: 1) } @@ -99,7 +113,7 @@ extension Date { } } -extension TimeZone { +extension TimeZone: AnyMockable { static var UTC: TimeZone { TimeZone(abbreviation: "UTC")! } static var EET: TimeZone { TimeZone(abbreviation: "EET")! } static func mockAny() -> TimeZone { .EET } @@ -111,7 +125,7 @@ extension Calendar { } } -extension URL { +extension URL: AnyMockable, RandomMockable { static func mockAny() -> URL { return URL(string: "https://www.datadoghq.com")! } @@ -131,7 +145,7 @@ extension URL { } } -extension String { +extension String: AnyMockable { static func mockAny() -> String { return "abc" } @@ -153,36 +167,40 @@ extension String { } } -extension Int { +extension Int: AnyMockable { static func mockAny() -> Int { return 0 } } -extension Int64 { +extension Int64: AnyMockable, RandomMockable { static func mockAny() -> Int64 { 0 } static func mockRandom() -> Int64 { Int64.random(in: Int64.min.. UInt64 { return 0 } } -extension Bool { +extension Bool: AnyMockable { static func mockAny() -> Bool { return false } } -extension Float { +extension Float: AnyMockable { static func mockAny() -> Float { return 0 } } -extension Double { +extension Double: AnyMockable, RandomMockable { + static func mockAny() -> Float { + return 0 + } + static func mockRandom() -> Double { return Double.random(in: 0.. URLRequest { return URLRequest(url: .mockAny()) } diff --git a/Tests/DatadogTests/Datadog/RUM/RUMEvent/RUMEventSanitizerTests.swift b/Tests/DatadogTests/Datadog/RUM/RUMEvent/RUMEventSanitizerTests.swift index 749dc19cb7..8b2be3f279 100644 --- a/Tests/DatadogTests/Datadog/RUM/RUMEvent/RUMEventSanitizerTests.swift +++ b/Tests/DatadogTests/Datadog/RUM/RUMEvent/RUMEventSanitizerTests.swift @@ -44,20 +44,6 @@ class RUMEventSanitizerTests: XCTestCase { "user-info-one.two.three.four.five.six.seven.eight.nine.ten": mockValue(), "user-info-one.two.three.four.five.six.seven.eight.nine.ten.eleven": mockValue(), "user-info-one.two.three.four.five.six.seven.eight.nine.ten.eleven.twelve": mockValue(), - ], - customViewTimings: [ - "timing-one": .mockRandom(), - "timing-one.two": .mockRandom(), - "timing-one.two.three": .mockRandom(), - "timing-one.two.three.four": .mockRandom(), - "timing-one.two.three.four.five": .mockRandom(), - "timing-one.two.three.four.five.six": .mockRandom(), - "timing-one.two.three.four.five.six.seven": .mockRandom(), - "timing-one.two.three.four.five.six.seven.eight": .mockRandom(), - "timing-one.two.three.four.five.six.seven.eight.nine": .mockRandom(), - "timing-one.two.three.four.five.six.seven.eight.nine.ten": .mockRandom(), - "timing-one.two.three.four.five.six.seven.eight.nine.ten.eleven": .mockRandom(), - "timing-one.two.three.four.five.six.seven.eight.nine.ten.eleven.twelve": .mockRandom(), ] ) @@ -90,19 +76,6 @@ class RUMEventSanitizerTests: XCTestCase { XCTAssertNotNil(sanitized.userInfoAttributes["user-info-one.two.three.four.five.six.seven.eight_nine_ten"]) XCTAssertNotNil(sanitized.userInfoAttributes["user-info-one.two.three.four.five.six.seven.eight_nine_ten_eleven"]) XCTAssertNotNil(sanitized.userInfoAttributes["user-info-one.two.three.four.five.six.seven.eight_nine_ten_eleven_twelve"]) - - XCTAssertEqual(sanitized.customViewTimings?.count, 12) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five.six"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five.six.seven"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five.six.seven.eight"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five.six.seven.eight_nine_ten"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five.six.seven.eight_nine_ten_eleven"]) - XCTAssertNotNil(sanitized.customViewTimings?["timing-one.two.three.four.five.six.seven.eight_nine_ten_eleven_twelve"]) } test(model: viewEvent) @@ -113,12 +86,11 @@ class RUMEventSanitizerTests: XCTestCase { func testWhenNumberOfAttributesExceedsLimit_itDropsExtraOnes() { func test(model: DM) { - let oneThirdOfTheLimit = Int(Double(AttributesSanitizer.Constraints.maxNumberOfAttributes) * 0.34) - let tripleTheLimit = AttributesSanitizer.Constraints.maxNumberOfAttributes * 3 + let oneHalfOfTheLimit = Int(Double(AttributesSanitizer.Constraints.maxNumberOfAttributes) * 0.5) + let twiceTheLimit = AttributesSanitizer.Constraints.maxNumberOfAttributes * 2 - let numberOfAttributes: Int = .random(in: oneThirdOfTheLimit...tripleTheLimit) - let numberOfUserInfoAttributes: Int = .random(in: oneThirdOfTheLimit...tripleTheLimit) - let numberOfTimings: Int = .random(in: oneThirdOfTheLimit...tripleTheLimit) + let numberOfAttributes: Int = .random(in: oneHalfOfTheLimit...twiceTheLimit) + let numberOfUserInfoAttributes: Int = .random(in: oneHalfOfTheLimit...twiceTheLimit) let mockAttributes = (0..( model: model, attributes: Dictionary(uniqueKeysWithValues: mockAttributes), - userInfoAttributes: Dictionary(uniqueKeysWithValues: mockUserInfoAttributes), - customViewTimings: Dictionary(uniqueKeysWithValues: mockTimings) + userInfoAttributes: Dictionary(uniqueKeysWithValues: mockUserInfoAttributes) ) // When @@ -142,15 +110,12 @@ class RUMEventSanitizerTests: XCTestCase { // Then var remaining = AttributesSanitizer.Constraints.maxNumberOfAttributes - let expectedSanitizedCustomTimings = min(sanitized.customViewTimings!.count, remaining) - remaining -= expectedSanitizedCustomTimings let expectedSanitizedUserInfo = min(sanitized.userInfoAttributes.count, remaining) remaining -= expectedSanitizedUserInfo let expectedSanitizedAttrs = min(sanitized.attributes.count, remaining) remaining -= expectedSanitizedAttrs XCTAssertGreaterThanOrEqual(remaining, 0) - XCTAssertEqual(sanitized.customViewTimings!.count, expectedSanitizedCustomTimings, "If number of attributes needs to be limited, `customViewTimings` are removed last") XCTAssertEqual(sanitized.userInfoAttributes.count, expectedSanitizedUserInfo, "If number of attributes needs to be limited, `userInfoAttributes` are removed second") XCTAssertEqual(sanitized.attributes.count, expectedSanitizedAttrs, "If number of attributes needs to be limited, `attributes` are removed first.") } diff --git a/Tests/DatadogTests/Datadog/RUM/RUMMonitor/Scopes/RUMViewScopeTests.swift b/Tests/DatadogTests/Datadog/RUM/RUMMonitor/Scopes/RUMViewScopeTests.swift index 35a485fade..45581d22fe 100644 --- a/Tests/DatadogTests/Datadog/RUM/RUMMonitor/Scopes/RUMViewScopeTests.swift +++ b/Tests/DatadogTests/Datadog/RUM/RUMMonitor/Scopes/RUMViewScopeTests.swift @@ -607,13 +607,13 @@ class RUMViewScopeTests: XCTestCase { let events = try XCTUnwrap(output.recordedEvents(ofType: RUMEvent.self)) XCTAssertEqual(events.count, 3, "There should be 3 View updates sent") - XCTAssertEqual(events[0].customViewTimings, [:]) + XCTAssertEqual(events[0].model.view.customTimings, [:]) XCTAssertEqual( - events[1].customViewTimings, + events[1].model.view.customTimings, ["timing-after-500000000ns": 500_000_000] ) XCTAssertEqual( - events[2].customViewTimings, + events[2].model.view.customTimings, ["timing-after-500000000ns": 500_000_000, "timing-after-1000000000ns": 1_000_000_000] ) } @@ -648,7 +648,7 @@ class RUMViewScopeTests: XCTestCase { // Then let lastEvent = try XCTUnwrap(output.recordedEvents(ofType: RUMEvent.self).last) - XCTAssertEqual(lastEvent.customViewTimings, [:]) + XCTAssertEqual(lastEvent.model.view.customTimings, [:]) } // MARK: - Dates Correction diff --git a/Tests/DatadogTests/Datadog/RUM/Scrubbing/RUMEventsMapperTests.swift b/Tests/DatadogTests/Datadog/RUM/Scrubbing/RUMEventsMapperTests.swift index eaf5f485cf..4260ddf6bd 100644 --- a/Tests/DatadogTests/Datadog/RUM/Scrubbing/RUMEventsMapperTests.swift +++ b/Tests/DatadogTests/Datadog/RUM/Scrubbing/RUMEventsMapperTests.swift @@ -76,19 +76,15 @@ class RUMEventsMapperTests: XCTestCase { // Then XCTAssertEqual(rumEvent1.attributes as! [String: String], mappedRUMEvent1.attributes as! [String: String]) XCTAssertEqual(rumEvent1.userInfoAttributes as! [String: String], mappedRUMEvent1.userInfoAttributes as! [String: String]) - XCTAssertEqual(rumEvent1.customViewTimings, mappedRUMEvent1.customViewTimings) XCTAssertEqual(rumEvent2.attributes as! [String: String], mappedRUMEvent2.attributes as! [String: String]) XCTAssertEqual(rumEvent2.userInfoAttributes as! [String: String], mappedRUMEvent2.userInfoAttributes as! [String: String]) - XCTAssertEqual(rumEvent2.customViewTimings, mappedRUMEvent2.customViewTimings) XCTAssertEqual(rumEvent3.attributes as! [String: String], mappedRUMEvent3.attributes as! [String: String]) XCTAssertEqual(rumEvent3.userInfoAttributes as! [String: String], mappedRUMEvent3.userInfoAttributes as! [String: String]) - XCTAssertEqual(rumEvent3.customViewTimings, mappedRUMEvent3.customViewTimings) XCTAssertEqual(rumEvent4.attributes as! [String: String], mappedRUMEvent4.attributes as! [String: String]) XCTAssertEqual(rumEvent4.userInfoAttributes as! [String: String], mappedRUMEvent4.userInfoAttributes as! [String: String]) - XCTAssertEqual(rumEvent4.customViewTimings, mappedRUMEvent4.customViewTimings) } func testGivenMappersEnabled_whenDroppingEvents_itReturnsNil() { From f6b5cbf8f331ba24c8ce78721bb290da51901eee Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Tue, 9 Feb 2021 14:14:43 +0100 Subject: [PATCH 24/36] RUMM-1000 Revert tests added for workarounds in #147 --- Sources/Datadog/Core/Utils/JSONEncoder.swift | 3 +++ .../Datadog/Core/Utils/JSONEncoderTests.swift | 27 ------------------- Tests/DatadogTests/Datadog/TracerTests.swift | 2 +- 3 files changed, 4 insertions(+), 28 deletions(-) diff --git a/Sources/Datadog/Core/Utils/JSONEncoder.swift b/Sources/Datadog/Core/Utils/JSONEncoder.swift index 37c9e5a52f..f6a2ae407b 100644 --- a/Sources/Datadog/Core/Utils/JSONEncoder.swift +++ b/Sources/Datadog/Core/Utils/JSONEncoder.swift @@ -14,6 +14,9 @@ extension JSONEncoder { let formatted = iso8601DateFormatter.string(from: date) try container.encode(formatted) } + if #available(iOS 13.0, OSX 10.15, *) { + encoder.outputFormatting = [.withoutEscapingSlashes] + } return encoder } } diff --git a/Tests/DatadogTests/Datadog/Core/Utils/JSONEncoderTests.swift b/Tests/DatadogTests/Datadog/Core/Utils/JSONEncoderTests.swift index dfa74a9df4..5e4fe43f8f 100644 --- a/Tests/DatadogTests/Datadog/Core/Utils/JSONEncoderTests.swift +++ b/Tests/DatadogTests/Datadog/Core/Utils/JSONEncoderTests.swift @@ -29,31 +29,4 @@ class JSONEncoderTests: XCTestCase { XCTAssertEqual(encodedURL.utf8String, #"{"value":"https:\/\/example.com\/foo"}"#) } } - - func testWhenEncoding_thenKeysFollowLexicographicOrder() throws { - struct Foo: Codable { - var one = 1 - var two = 1 - var three = 1 - var four = 1 - var five = 1 - - enum CodingKeys: String, CodingKey { - case one = "aaaaaa" - case two = "bb" - case three = "aaa" - case four = "bbb" - case five = "aaa.aaa" - } - } - - // When - let encodedFoo = try jsonEncoder.encode(Foo()) - - // Then - XCTAssertEqual( - encodedFoo.utf8String, - #"{"aaa":1,"aaa.aaa":1,"aaaaaa":1,"bb":1,"bbb":1}"# - ) - } } diff --git a/Tests/DatadogTests/Datadog/TracerTests.swift b/Tests/DatadogTests/Datadog/TracerTests.swift index 0255a3d1fb..bb3e35eef1 100644 --- a/Tests/DatadogTests/Datadog/TracerTests.swift +++ b/Tests/DatadogTests/Datadog/TracerTests.swift @@ -583,7 +583,7 @@ class TracerTests: XCTestCase { ) XCTAssertEqual( try spanMatcher.meta.custom(keyPath: "meta.person"), - #"{"age":30,"name":"Adam","nationality":"Polish"}"# + #"{"name":"Adam","age":30,"nationality":"Polish"}"# ) XCTAssertEqual(try spanMatcher.meta.custom(keyPath: "meta.nested.string"), "hello") XCTAssertEqual(try spanMatcher.meta.custom(keyPath: "meta.url"), "https://example.com/image.png") From 318d9b5d7c0a4bace24f6f235d014cb0695b9f5f Mon Sep 17 00:00:00 2001 From: Alexandre Costanza Date: Tue, 9 Feb 2021 14:32:55 +0100 Subject: [PATCH 25/36] RUMM-1000 Fix benchmark tests --- .../DataStorage/RUMStorageBenchmarkTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/DatadogBenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift b/Tests/DatadogBenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift index c9a6e6652b..5f57f35c38 100644 --- a/Tests/DatadogBenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift +++ b/Tests/DatadogBenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift @@ -99,6 +99,7 @@ class RUMStorageBenchmarkTests: XCTestCase { action: .init(count: .mockAny()), crash: .init(count: .mockAny()), cumulativeLayoutShift: nil, + customTimings: .mockAny(), domComplete: nil, domContentLoaded: nil, domInteractive: nil, @@ -120,8 +121,7 @@ class RUMStorageBenchmarkTests: XCTestCase { ) ), attributes: ["attribute": "value"], - userInfoAttributes: ["str": "value", "int": 11_235, "bool": true], - customViewTimings: nil + userInfoAttributes: ["str": "value", "int": 11_235, "bool": true] ) } } From c83e61d9bb9a3ffefb294268c20515c3694c5b9f Mon Sep 17 00:00:00 2001 From: Ignacio Bonafonte Date: Wed, 10 Feb 2021 15:24:11 +0100 Subject: [PATCH 26/36] Updated Swift testing version number --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 07cb28af57..044b1766c0 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ tools: @echo "OK 👌" # The release version of `dd-sdk-swift-testing` to use for tests instrumentation. -DD_SDK_SWIFT_TESTING_VERSION = 0.5.1 +DD_SDK_SWIFT_TESTING_VERSION = 0.6.0 define DD_SDK_TESTING_XCCONFIG_CI FRAMEWORK_SEARCH_PATHS=$$(inherited) $$(SRCROOT)/../instrumented-tests/DatadogSDKTesting.xcframework/ios-arm64_x86_64-simulator/\n From 2bd8a20a9aa679bcebc9084fcf366f2c90f75115 Mon Sep 17 00:00:00 2001 From: Xavier Gouchet Date: Thu, 11 Feb 2021 10:21:09 +0100 Subject: [PATCH 27/36] RUMM-1018 Use bundle exec pod install to ensure a proper Podfile.lock file --- dogfood.py => tools/dogfooding/dogfood.py | 62 ++++++++++++++--------- 1 file changed, 39 insertions(+), 23 deletions(-) rename dogfood.py => tools/dogfooding/dogfood.py (73%) diff --git a/dogfood.py b/tools/dogfooding/dogfood.py similarity index 73% rename from dogfood.py rename to tools/dogfooding/dogfood.py index 1bd38766cd..d94dbf457b 100755 --- a/dogfood.py +++ b/tools/dogfooding/dogfood.py @@ -9,6 +9,7 @@ import subprocess import sys import os +import subprocess from argparse import ArgumentParser, Namespace from tempfile import TemporaryDirectory from typing import Tuple @@ -52,39 +53,48 @@ def github_create_pr(repository: str, branch_name: str, base_name: str, version: return 1 -def generate_target_code(target: str, temp_dir_path: str, version: str): +def generate_target_code(target: str, temp_dir_path: str, version: str) -> int: print("… Generating code with version " + version) if target == TARGET_APP: - target_file = os.path.join(temp_dir_path, "Podfile") + print("… Updating app's Podfile") + target_file_path = os.path.join(temp_dir_path, "Podfile") content = "" - with open(target_file, 'r') as target: - lines = target.readlines() + with open(target_file_path, 'r') as target_file: + lines = target_file.readlines() for line in lines: if "pod 'DatadogSDK'" in line: content = content + " pod 'DatadogSDK', :git => 'https://github.com/DataDog/dd-sdk-ios.git', :tag => '" + version + "'\n" else: content = content + line - with open(target_file, 'w') as target: - target.write(content) - - target_file = os.path.join(temp_dir_path, "Podfile.lock") - content = "" - with open(target_file, 'r') as target: - lines = target.readlines() - for line in lines: - if " - DatadogSDK (from " in line: - content = content + " - DatadogSDK (from `https://github.com/DataDog/dd-sdk-ios.git`, tag `" + version + "`)\n" - elif " - DatadogSDK (" in line: - content = content + " - DatadogSDK (" + version + ")\n" - else: - content = content + line - - with open(target_file, 'w') as target: - target.write(content) - + with open(target_file_path, 'w') as target_file: + target_file.write(content) + + + print("… Running `bundle exec pod install`") + os.chdir(temp_dir_path) + cmd_args = ['bundle', 'exec', 'pod', 'install'] + process = subprocess.Popen(cmd_args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) + try: + output, errlog = process.communicate(timeout=120) + except subprocess.TimeoutExpired: + print("✘ generation timeout for " + target + ", version: " + version) + return 1 + + if process.returncode is None: + print("✘ generation status unknown for " + target + ", version: " + version) + return 1 + elif process.returncode > 0: + print("✘ generation failed for " + target + ", version: " + version) + print(output.decode("utf-8")) + print(errlog.decode("utf-8")) + return 1 + else: + return 0 # TODO RUMM-1063 elif target == TARGET_DEMO: … + else: + print("? unknown generation target: " + target + ", version: " + version) def git_clone_repository(repo_name: str, gh_token: str, temp_dir_path: str) -> Tuple[Repo, str]: @@ -116,7 +126,13 @@ def update_dependant(version: str, target: str, gh_token: str) -> int: print("… Creating branch " + branch_name) repo.git.checkout('HEAD', b=branch_name) - generate_target_code(target, temp_dir_path, version) + + cwd = os.getcwd() + result = generate_target_code(target, temp_dir_path, version) + os.chdir(cwd) + + if result > 0: + return result if not repo.is_dirty(): print("∅ Nothing to commit, all is in order…") From fc961b7340bce3b91b2a32857c04614160d46fe7 Mon Sep 17 00:00:00 2001 From: Ben Pollman Date: Mon, 8 Feb 2021 19:35:52 +1100 Subject: [PATCH 28/36] Swift Package Manager - Add static library variant's to allow use inside nested frameworks --- Package.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Package.swift b/Package.swift index f01fb582f3..ca410a64ad 100644 --- a/Package.swift +++ b/Package.swift @@ -16,6 +16,14 @@ let package = Package( name: "DatadogObjc", type: .dynamic, targets: ["DatadogObjc"]), + .library( + name: "DatadogStatic", + type: .static, + targets: ["Datadog"]), + .library( + name: "DatadogStaticObjc", + type: .static, + targets: ["DatadogObjc"]), ], dependencies: [], targets: [ From 66898c39a859ef0957026fa7caef5294b514a081 Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Tue, 19 Jan 2021 11:54:52 +0100 Subject: [PATCH 29/36] RUMM-924 Add `gdpr.md` --- docs/gdpr.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/gdpr.md diff --git a/docs/gdpr.md b/docs/gdpr.md new file mode 100644 index 0000000000..4eb6ca7f03 --- /dev/null +++ b/docs/gdpr.md @@ -0,0 +1,18 @@ +# Tracking Consent + +### Tracking consent values + +To be compliant with the GDPR regulation, the SDK requires the tracking consent value at initialization. +The `trackingConsent` can be one of the following values: + +1. `TrackingConsent.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. +2. `TrackingConsent.granted` - the SDK starts collecting the data and sends it to Datadog. +3. `TrackingConsent.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + +### Updating the tracking consent at runtime + +To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. +The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + +- if changed to `.granted`, the SDK will send all current and future data to Datadog; +- if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. From 75664b7113361db05accd1d65ecdb1ecbd0d90a6 Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Tue, 19 Jan 2021 13:08:35 +0100 Subject: [PATCH 30/36] RUMM-924 Add data scrubbing doc --- docs/rum_collection.md | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docs/rum_collection.md b/docs/rum_collection.md index f8ac098405..543e9d3a8f 100644 --- a/docs/rum_collection.md +++ b/docs/rum_collection.md @@ -265,6 +265,50 @@ Global.rum.addError(message: "error message.") For more details and available options, refer to the code documentation comments in `DDRUMMonitor` class. +## Data scrubbing + +To modify RUM event attributes before it is send to Datadog or to drop particular event entirely, use event mappers API when configuring the SDK: +```swift +Datadog.Configuration + .builderUsing(...) + .setRUMViewEventMapper { viewEvent in + return viewEvent + } + .setRUMErrorEventMapper { errorEvent in + return errorEvent + } + .setRUMResourceEventMapper { resourceEvent in + return resourceEvent + } + .setRUMActionEventMapper { actionEvent in + return actionEvent + } + .build() +``` +Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it gets send, for example to redact sensitive information in RUM Resource's `url` you may implement custom `redacted(_:) -> String` function and use it in `RUMResourceEventMapper`: +```swift +.setRUMResourceEventMapper { resourceEvent in + var resourceEvent = resourceEvent + resourceEvent.resource.url = redacted(resourceEvent.resource.url) + return resourceEvent +} +``` +Returning `nil` from the mapper will drop the event entirely (it won't be send to Datadog). + +Only some properties on each event can be mutated: + +| Event Type | Attribute key | Description | +|-------------------|-----------------------------------|-------------------------------------------------| +| RUMViewEvent | `viewEvent.view.url` | URL of the view | +| RUMActionEvent | `actionEvent.action.target?.name` | Name of the action | +| | `actionEvent.view.url` | URL of the view linked to this action | +| RUMErrorEvent | `errorEvent.error.message` | Error message | +| | `errorEvent.error.stack` | Stacktrace of the error | +| | `errorEvent.error.resource?.url` | URL of the resource the error refers to | +| | `errorEvent.view.url` | URL of the view linked to this error | +| RUMResourceEvent | `resourceEvent.resource.url` | URL of the resource | +| | `resourceEvent.view.url` | URL of the view linked to this resource | + [1]: https://docs.datadoghq.com/real_user_monitoring/data_collected/ [2]: https://github.com/DataDog/dd-sdk-ios [3]: https://github.com/DataDog/dd-sdk-ios/releases From 830a0bd654c28e762db1ca7097ae173f56edbfdc Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Tue, 19 Jan 2021 14:01:34 +0100 Subject: [PATCH 31/36] RUMM-924 Update Logs, Traces and RUM docs with `trackingConsent` API --- docs/log_collection.md | 15 +++++++++++++++ docs/rum_collection.md | 15 +++++++++++++++ docs/trace_collection.md | 17 ++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/log_collection.md b/docs/log_collection.md index 573d2f45fc..b5ebc59514 100644 --- a/docs/log_collection.md +++ b/docs/log_collection.md @@ -52,6 +52,7 @@ github "DataDog/dd-sdk-ios" ```swift Datadog.initialize( appContext: .init(), + trackingConsent: trackingConsent, configuration: Datadog.Configuration .builderUsing(clientToken: "", environment: "") .set(serviceName: "app-name") @@ -65,6 +66,7 @@ Datadog.initialize( ```swift Datadog.initialize( appContext: .init(), + trackingConsent: trackingConsent, configuration: Datadog.Configuration .builderUsing(clientToken: "", environment: "") .set(serviceName: "app-name") @@ -76,6 +78,19 @@ Datadog.initialize( {{% /tab %}} {{< /tabs >}} + To be compliant with the GDPR regulation, the SDK requires the `trackingConsent` value at initialization. + The `trackingConsent` can be one of the following values: + + - `.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. + - `.granted` - the SDK starts collecting the data and sends it to Datadog. + - `.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + + To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. + The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + + - if changed to `.granted`, the SDK will send all current and future data to Datadog; + - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. + When writing your application, you can enable development logs. All internal messages in the SDK with a priority equal to or higher than the provided level are then logged to console logs. ```swift diff --git a/docs/rum_collection.md b/docs/rum_collection.md index 543e9d3a8f..9a9834b0d8 100644 --- a/docs/rum_collection.md +++ b/docs/rum_collection.md @@ -51,6 +51,7 @@ github "DataDog/dd-sdk-ios" ```swift Datadog.initialize( appContext: .init(), + trackingConsent: trackingConsent, configuration: Datadog.Configuration .builderUsing( rumApplicationID: "", @@ -68,6 +69,7 @@ Datadog.initialize( ```swift Datadog.initialize( appContext: .init(), + trackingConsent: trackingConsent, configuration: Datadog.Configuration .builderUsing( rumApplicationID: "", @@ -83,6 +85,19 @@ Datadog.initialize( {{% /tab %}} {{< /tabs >}} + To be compliant with the GDPR regulation, the SDK requires the `trackingConsent` value at initialization. + The `trackingConsent` can be one of the following values: + + - `.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. + - `.granted` - the SDK starts collecting the data and sends it to Datadog. + - `.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + + To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. + The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + + - if changed to `.granted`, the SDK will send all current and future data to Datadog; + - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. + 3. Configure and register the RUM Monitor. You only need to do it once, usually in your `AppDelegate` code: ```swift diff --git a/docs/trace_collection.md b/docs/trace_collection.md index ccdef2d3dd..ca11b1826f 100644 --- a/docs/trace_collection.md +++ b/docs/trace_collection.md @@ -50,6 +50,7 @@ github "DataDog/dd-sdk-ios" ```swift Datadog.initialize( appContext: .init(), + trackingConsent: trackingConsent, configuration: Datadog.Configuration .builderUsing(clientToken: "", environment: "") .set(serviceName: "app-name") @@ -63,6 +64,7 @@ Datadog.initialize( ```swift Datadog.initialize( appContext: .init(), + trackingConsent: trackingConsent, configuration: Datadog.Configuration .builderUsing(clientToken: "", environment: "") .set(serviceName: "app-name") @@ -74,7 +76,20 @@ Datadog.initialize( {{% /tab %}} {{< /tabs >}} - When writing your application, you can enable development logs. All internal messages in the SDK with a priority equal to or higher than the provided level are then logged to console logs. + To be compliant with the GDPR regulation, the SDK requires the `trackingConsent` value at initialization. + The `trackingConsent` can be one of the following values: + + - `.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. + - `.granted` - the SDK starts collecting the data and sends it to Datadog. + - `.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + + To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. + The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + + - if changed to `.granted`, the SDK will send all current and future data to Datadog; + - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. + + When writing your application, you can enable development logs. All internal messages in the SDK with a priority equal to or higher than the provided level are then logged to console logs. ```swift Datadog.verbosityLevel = .debug From 81788e90b4e0b8f2168812ab15aca5d5941f287b Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Tue, 19 Jan 2021 14:03:24 +0100 Subject: [PATCH 32/36] RUMM-924 Update table of contents in `docs/README.md` --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index c3934967df..297da221d7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,5 +2,7 @@ Find in this folder dedicated documentation for: +* [Tracking consent API (GDPR)](gdpr.md). * [Collecting and sending logs from your iOS application to Datadog](log_collection.md). * [Collecting and sending traces from your iOS application to Datadog](trace_collection.md). +* [Collecting and sending RUM events from your iOS application to Datadog](rum_collection.md). From 325bfb98e18880dcd7195279617b3c5aaa92d44b Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Tue, 19 Jan 2021 14:13:43 +0100 Subject: [PATCH 33/36] RUMM-924 Update `README.md` with image and link to RUM docs --- README.md | 6 ++++++ docs/images/rum.png | Bin 0 -> 517770 bytes 2 files changed, 6 insertions(+) create mode 100644 docs/images/rum.png diff --git a/README.md b/README.md index 70502ffe03..66c787fc57 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ See [Datadog iOS Trace Collection](https://docs.datadoghq.com/tracing/setup/ios/ ![Datadog iOS Log Collection](docs/images/tracing.png) +### RUM Events Collection + +See [Datadog iOS RUM Collection](https://docs.datadoghq.com/real_user_monitoring/ios/?tab=us) documentation to try it out. + +![Datadog iOS RUM Collection](docs/images/rum.png) + ## Integrations ### Alamofire diff --git a/docs/images/rum.png b/docs/images/rum.png new file mode 100644 index 0000000000000000000000000000000000000000..ab12b169553425bc0e7184b16e98d31002c5f512 GIT binary patch literal 517770 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�O&z%o9zJ<6+Y6;1mRiTS`4jGi{ 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�w>G4Zx@@9cTK0+a1A~s?*8=aJ|=>H?_tfT7K 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 Date: Tue, 19 Jan 2021 16:32:25 +0100 Subject: [PATCH 34/36] RUMM-924 CR fix: wording Co-authored-by: Alex Costanza --- docs/rum_collection.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/rum_collection.md b/docs/rum_collection.md index 9a9834b0d8..36cc8f3f3b 100644 --- a/docs/rum_collection.md +++ b/docs/rum_collection.md @@ -282,7 +282,7 @@ For more details and available options, refer to the code documentation comments ## Data scrubbing -To modify RUM event attributes before it is send to Datadog or to drop particular event entirely, use event mappers API when configuring the SDK: +To modify the attributes of a RUM event before it is sent to Datadog or to drop an event entirely, use the event mappers API when configuring the SDK: ```swift Datadog.Configuration .builderUsing(...) @@ -300,7 +300,7 @@ Datadog.Configuration } .build() ``` -Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it gets send, for example to redact sensitive information in RUM Resource's `url` you may implement custom `redacted(_:) -> String` function and use it in `RUMResourceEventMapper`: +Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it gets sent, for example to redact sensitive information in RUM Resource's `url` you may implement a custom `redacted(_:) -> String` function and use it in `RUMResourceEventMapper`: ```swift .setRUMResourceEventMapper { resourceEvent in var resourceEvent = resourceEvent @@ -308,9 +308,9 @@ Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a c return resourceEvent } ``` -Returning `nil` from the mapper will drop the event entirely (it won't be send to Datadog). +Returning `nil` from the mapper will drop the event entirely (it won't be sent to Datadog). -Only some properties on each event can be mutated: +Depending on a given event's type, only some specific properties can be mutated: | Event Type | Attribute key | Description | |-------------------|-----------------------------------|-------------------------------------------------| From 454adc549a55716f39a6aae61835ed72245eb481 Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Tue, 26 Jan 2021 18:30:46 +0100 Subject: [PATCH 35/36] RUMM-924 Apply suggestions from code review Co-authored-by: cswatt --- docs/gdpr.md | 6 +++--- docs/log_collection.md | 6 +++--- docs/rum_collection.md | 8 ++++---- docs/trace_collection.md | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/gdpr.md b/docs/gdpr.md index 4eb6ca7f03..fc31255af8 100644 --- a/docs/gdpr.md +++ b/docs/gdpr.md @@ -7,12 +7,12 @@ The `trackingConsent` can be one of the following values: 1. `TrackingConsent.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. 2. `TrackingConsent.granted` - the SDK starts collecting the data and sends it to Datadog. -3. `TrackingConsent.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. +3. `TrackingConsent.notGranted` - the SDK does not collect any data: logs, traces, and RUM events are not sent to Datadog. ### Updating the tracking consent at runtime -To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. -The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: +To change the tracking consent value after the SDK is initialized, use the `Datadog.set(trackingConsent:)` API call. +The SDK changes its behavior according to the new value. For example, if the current tracking consent is `.pending`: - if changed to `.granted`, the SDK will send all current and future data to Datadog; - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. diff --git a/docs/log_collection.md b/docs/log_collection.md index b5ebc59514..0359c1b2ec 100644 --- a/docs/log_collection.md +++ b/docs/log_collection.md @@ -83,10 +83,10 @@ Datadog.initialize( - `.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. - `.granted` - the SDK starts collecting the data and sends it to Datadog. - - `.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + - `.notGranted` - the SDK does not collect any data: logs, traces, and RUM events are not sent to Datadog. - To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. - The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + To change the tracking consent value after the SDK is initialized, use the `Datadog.set(trackingConsent:)` API call. + The SDK changes its behavior according to the new value. For example, if the current tracking consent is `.pending`: - if changed to `.granted`, the SDK will send all current and future data to Datadog; - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. diff --git a/docs/rum_collection.md b/docs/rum_collection.md index 36cc8f3f3b..79a5bf99d0 100644 --- a/docs/rum_collection.md +++ b/docs/rum_collection.md @@ -90,10 +90,10 @@ Datadog.initialize( - `.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. - `.granted` - the SDK starts collecting the data and sends it to Datadog. - - `.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + - `.notGranted` - the SDK does not collect any data: logs, traces, and RUM events are not sent to Datadog. - To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. - The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + To change the tracking consent value after the SDK is initialized, use the `Datadog.set(trackingConsent:)` API call. + The SDK changes its behavior according to the new value. For example, if the current tracking consent is `.pending`: - if changed to `.granted`, the SDK will send all current and future data to Datadog; - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. @@ -300,7 +300,7 @@ Datadog.Configuration } .build() ``` -Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it gets sent, for example to redact sensitive information in RUM Resource's `url` you may implement a custom `redacted(_:) -> String` function and use it in `RUMResourceEventMapper`: +Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it gets sent. For example to redact sensitive information in RUM Resource's `url` you may implement a custom `redacted(_:) -> String` function and use it in `RUMResourceEventMapper`: ```swift .setRUMResourceEventMapper { resourceEvent in var resourceEvent = resourceEvent diff --git a/docs/trace_collection.md b/docs/trace_collection.md index ca11b1826f..1a79353de6 100644 --- a/docs/trace_collection.md +++ b/docs/trace_collection.md @@ -81,10 +81,10 @@ Datadog.initialize( - `.pending` - the SDK starts collecting and batching the data but does not send it to Datadog. The SDK waits for the new tracking consent value to decide what to do with the batched data. - `.granted` - the SDK starts collecting the data and sends it to Datadog. - - `.notGranted` - the SDK does not collect any data: logs, traces and RUM events will not be send to Datadog. + - `.notGranted` - the SDK does not collect any data: logs, traces, and RUM events are not sent to Datadog. - To change the tracking consent value after the SDK is initialized, use `Datadog.set(trackingConsent:)` API. - The SDK will change its behavior according to the new value, e.g. if the current tracking consent is `.pending`: + To change the tracking consent value after the SDK is initialized, use the `Datadog.set(trackingConsent:)` API call. + The SDK changes its behavior according to the new value. For example, if the current tracking consent is `.pending`: - if changed to `.granted`, the SDK will send all current and future data to Datadog; - if changed to `.notGranted`, the SDK will wipe all current data and will not collect any future data. From 1d65b6d0fe0e9ff885d08fe104ae06a57d976289 Mon Sep 17 00:00:00 2001 From: Maciek Grzybowski Date: Fri, 19 Feb 2021 10:46:35 +0100 Subject: [PATCH 36/36] RUMM-924 Add notes on recent changes made in #415 and #418 --- docs/rum_collection.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/rum_collection.md b/docs/rum_collection.md index 79a5bf99d0..539a877b18 100644 --- a/docs/rum_collection.md +++ b/docs/rum_collection.md @@ -308,13 +308,14 @@ Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a c return resourceEvent } ``` -Returning `nil` from the mapper will drop the event entirely (it won't be sent to Datadog). +Returning `nil` from the error, resource or action mapper will drop the event entirely (it won't be sent to Datadog). The value returned from the view event mapper must be not `nil`. Depending on a given event's type, only some specific properties can be mutated: | Event Type | Attribute key | Description | |-------------------|-----------------------------------|-------------------------------------------------| -| RUMViewEvent | `viewEvent.view.url` | URL of the view | +| RUMViewEvent | `viewEvent.view.name` | Name of the view | +| | `viewEvent.view.url` | URL of the view | | RUMActionEvent | `actionEvent.action.target?.name` | Name of the action | | | `actionEvent.view.url` | URL of the view linked to this action | | RUMErrorEvent | `errorEvent.error.message` | Error message |