Skip to content

Commit 2ebc35a

Browse files
committed
Merge branch 'develop'
2 parents cc4ba2b + 5d7c1ac commit 2ebc35a

File tree

4 files changed

+111
-3
lines changed

4 files changed

+111
-3
lines changed

README.md

-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
align="right" width="64" height="64" />
44
</h2>
55

6-
**2024-01-19**: Seems to be b0rked w/ Xcode 15.2: Issue https://github.com/Data-swift/ManagedModels/issues/25
7-
86
> Instead of wrapping CoreData, use it directly :-)
97
108
The key thing **ManagedModels** provides is a `@Model` macro,

Sources/ManagedModels/SchemaCompatibility/NSAttributeDescription+Data.swift

+9-1
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,12 @@ extension CoreData.NSAttributeDescription: SchemaProperty {
8484
ValueTransformer
8585
.setValueTransformer(transformer, forName: .init(name))
8686
}
87+
assert(ValueTransformer.valueTransformerNames().contains(.init(name)))
8788
valueTransformerName = name
89+
assert(valueTransformerName != nil)
8890
}
8991
setValueClassName(for: codableType)
92+
return
9093
}
9194

9295
// TBD:
@@ -162,7 +165,11 @@ public extension NSAttributeDescription {
162165
if let hashModifier { versionHashModifier = hashModifier }
163166
if let defaultValue { self.defaultValue = defaultValue }
164167
isOptional = valueType is any AnyOptional.Type
168+
169+
assert(valueTransformerName == nil)
170+
valueTransformerName = nil
165171
if valueType != Any.self { self.valueType = valueType }
172+
166173
setOptions(options)
167174
}
168175
}
@@ -174,7 +181,6 @@ private extension NSAttributeDescription {
174181
allowsExternalBinaryDataStorage = false
175182
isIndexedBySpotlight = false
176183
isTransient = false
177-
valueTransformerName = nil
178184
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
179185
allowsCloudEncryption = false
180186
}
@@ -190,8 +196,10 @@ private extension NSAttributeDescription {
190196
case .ephemeral: isTransient = true
191197

192198
case .transformableByName(let name):
199+
assert(valueTransformerName == nil)
193200
valueTransformerName = name
194201
case .transformableByType(let type):
202+
assert(valueTransformerName == nil)
195203
valueTransformerName = NSStringFromClass(type)
196204

197205
case .allowsCloudEncryption: // FIXME: restrict availability
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//
2+
// Created by Helge Heß.
3+
// Copyright © 2024 ZeeZide GmbH.
4+
//
5+
6+
import XCTest
7+
import Foundation
8+
import CoreData
9+
@testable import ManagedModels
10+
11+
final class CodablePropertiesTests: XCTestCase {
12+
13+
private lazy var container = try? ModelContainer(
14+
for: Fixtures.CodablePropertiesSchema.managedObjectModel,
15+
configurations: ModelConfiguration(isStoredInMemoryOnly: true)
16+
)
17+
18+
func testEntityName() throws {
19+
let entityType = Fixtures.CodablePropertiesSchema.StoredAccess.self
20+
XCTAssertEqual(entityType.entity().name, "StoredAccess")
21+
}
22+
23+
func testPropertySetup() throws {
24+
let valueType = Fixtures.CodablePropertiesSchema.AccessSIP.self
25+
let attribute = CoreData.NSAttributeDescription(
26+
name: "sip",
27+
valueType: valueType,
28+
defaultValue: nil
29+
)
30+
XCTAssertEqual(attribute.name, "sip")
31+
XCTAssertEqual(attribute.attributeType, .transformableAttributeType)
32+
33+
let transformerName = try XCTUnwrap(
34+
ValueTransformer.valueTransformerNames().first(where: {
35+
$0.rawValue.range(of: "CodableBox11TransformerVOO17ManagedModelTests8")
36+
!= nil
37+
})
38+
)
39+
let transformer = try XCTUnwrap(ValueTransformer(forName: transformerName))
40+
_ = transformer // to clear unused-wraning
41+
42+
XCTAssertTrue(attribute.valueType ==
43+
CodableBox<Fixtures.CodablePropertiesSchema.AccessSIP>.self)
44+
XCTAssertNotNil(attribute.valueTransformerName)
45+
XCTAssertEqual(attribute.valueTransformerName, transformerName.rawValue)
46+
}
47+
48+
func testCodablePropertyEntity() throws {
49+
let entity = try XCTUnwrap(
50+
container?.managedObjectModel.entitiesByName["StoredAccess"]
51+
)
52+
53+
// Creating the entity should have registered the transformer for the
54+
// CodableBox.
55+
let transformerName = try XCTUnwrap(
56+
ValueTransformer.valueTransformerNames().first(where: {
57+
$0.rawValue.range(of: "CodableBox11TransformerVOO17ManagedModelTests8")
58+
!= nil
59+
})
60+
)
61+
let transformer = try XCTUnwrap(ValueTransformer(forName: transformerName))
62+
_ = transformer // to clear unused-wraning
63+
64+
let attribute = try XCTUnwrap(entity.attributesByName["sip"])
65+
XCTAssertEqual(attribute.name, "sip")
66+
XCTAssertTrue(attribute.valueType ==
67+
CodableBox<Fixtures.CodablePropertiesSchema.AccessSIP>.self)
68+
XCTAssertNotNil(attribute.valueTransformerName)
69+
XCTAssertEqual(attribute.valueTransformerName, transformerName.rawValue)
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// Created by Helge Heß.
3+
// Copyright © 2024 ZeeZide GmbH.
4+
//
5+
6+
import ManagedModels
7+
8+
extension Fixtures {
9+
// https://github.com/Data-swift/ManagedModels/issues/27
10+
11+
enum CodablePropertiesSchema: VersionedSchema {
12+
static var models : [ any PersistentModel.Type ] = [
13+
StoredAccess.self
14+
]
15+
16+
public static let versionIdentifier = Schema.Version(0, 1, 0)
17+
18+
@Model
19+
final class StoredAccess: NSManagedObject {
20+
var token : String
21+
var expires : Date
22+
var sip : AccessSIP
23+
}
24+
25+
struct AccessSIP: Codable {
26+
var username : String
27+
var password : String
28+
var realm : String
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)