Author: ericwa Date: Sun Mar 16 00:22:08 2014 New Revision: 10575 URL: http://svn.gna.org/viewcvs/etoile?rev=10575&view=rev Log: COPersistentRoot: add a property, which is a thin wrapper around the property. Reason for adding is both Typewriter and ProjectDemo have incompatible homegrown versions of this idea, and probably every application will need it. NOTE: as mentioned in the comment, I don't know whether we should call this , , , etc... It's called to match COObject's -name.
Modified: trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.h trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.m trunk/Etoile/Frameworks/CoreObject/Tests/Core/TestPersistentRoot.m Modified: trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.h URL: http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.h?rev=10575&r1=10574&r2=10575&view=diff ============================================================================== --- trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.h (original) +++ trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.h Sun Mar 16 00:22:08 2014 @@ -260,7 +260,22 @@ * See COPersistentRootAttributeExportSize, COPersistentRootAttributeUsedSize. */ @property (nonatomic, readonly) NSDictionary *attributes; - +/** + * The user-facing name of the persistent root. This property is provided for + * convenience; it is implemented on top of the metadata property. + * + * Because it's stored in the metadata dictionary, changes to the name are visible + * across all revisions and branches. + * + * You could also store a document name in + * the root object's -name property (see -[COObject name]), which would have the + * expected consequences: changing the name would cause a new revision to be committed, + * old revisions would still use the old name, and different branches could have different names + * for the document. + * + * TODO: Rename to -displayName or -label to emphasize that this is the user-facing name? + */ +@property (nonatomic, copy) NSString *name; /** @taskunit Accessing Branches */ Modified: trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.m URL: http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.m?rev=10575&r1=10574&r2=10575&view=diff ============================================================================== --- trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.m (original) +++ trunk/Etoile/Frameworks/CoreObject/Core/COPersistentRoot.m Sun Mar 16 00:22:08 2014 @@ -25,6 +25,11 @@ NSString * const COPersistentRootDidChangeNotification = @"COPersistentRootDidChangeNotification"; +/** + * Metadata dictionary key used by the `name` property. + */ +NSString * const COPersistentRootName = @"org.etoile.coreobject.name"; + @implementation COPersistentRoot @synthesize parentContext = _parentContext, UUID = _UUID; @@ -282,6 +287,25 @@ - (NSDictionary *)attributes { return [[self store] attributesForPersistentRootWithUUID: _UUID]; +} + +- (NSString *) name +{ + return self.metadata[COPersistentRootName]; +} + +- (void) setName: (NSString *)name +{ + NSMutableDictionary *md = [[NSMutableDictionary alloc] initWithDictionary: self.metadata]; + if (name == nil) + { + [md removeObjectForKey: COPersistentRootName]; + } + else + { + md[COPersistentRootName] = [[NSString alloc] initWithString: name]; + } + self.metadata = md; } #pragma mark Accessing Branches - Modified: trunk/Etoile/Frameworks/CoreObject/Tests/Core/TestPersistentRoot.m URL: http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Tests/Core/TestPersistentRoot.m?rev=10575&r1=10574&r2=10575&view=diff ============================================================================== --- trunk/Etoile/Frameworks/CoreObject/Tests/Core/TestPersistentRoot.m (original) +++ trunk/Etoile/Frameworks/CoreObject/Tests/Core/TestPersistentRoot.m Sun Mar 16 00:22:08 2014 @@ -691,4 +691,51 @@ }]; } +- (void) testNameBasic +{ + UKNil(persistentRoot.name); + UKFalse(persistentRoot.hasChanges); + + persistentRoot.name = @"todo"; + + UKObjectsEqual(@"todo", persistentRoot.name); + UKTrue(persistentRoot.hasChanges); + [persistentRoot commit]; + + [self checkPersistentRootWithExistingAndNewContext: persistentRoot + inBlock: ^(COEditingContext *testCtx, COPersistentRoot *testProot, COBranch *testBranch, BOOL isNewContext) + { + UKObjectsEqual(@"todo", persistentRoot.name); + }]; +} + +- (void) testNameSetToNil +{ + persistentRoot.name = @"todo"; + [persistentRoot commit]; + + persistentRoot.name = nil; + UKNil(persistentRoot.name); + UKTrue(persistentRoot.hasChanges); + [persistentRoot commit]; + + [self checkPersistentRootWithExistingAndNewContext: persistentRoot + inBlock: ^(COEditingContext *testCtx, COPersistentRoot *testProot, COBranch *testBranch, BOOL isNewContext) + { + UKNil(persistentRoot.name); + }]; +} + +- (void) testNameCopies +{ + NSMutableString *ms = [NSMutableString new]; + persistentRoot.name = ms; + + UKObjectsEqual(@"", persistentRoot.name); + UKRaisesException([(NSMutableString *)persistentRoot.name appendString: @"foo"]); + + [ms appendString: @"a"]; + UKObjectsEqual(@"", persistentRoot.name); +} + @end _______________________________________________ Etoile-cvs mailing list Etoile-cvs@gna.org https://mail.gna.org/listinfo/etoile-cvs