mogenerator + Xmo'd
Visit the project's pretty homepage.
Here's mogenerator's elevator pitch:
mogeneratoris a command-line tool that, given an
.xcdatamodelfile, will generate two classes per entity. The first class,
_MyEntity, is intended solely for machine consumption and will be continuously overwritten to stay in sync with your data model. The second class,
_MyEntity, won't ever be overwritten and is a great place to put your custom logic.
Senseful wrote up a nice summary of mogenerator's command-line options.
Xmo'd (pronounced ex-mowed) is an Xcode plugin that integrates mogenerator into Xcode. It saves you the hassle of having to write a Run Script Build Phase and/or manually adding+removing source files from your project as you add+remove entities.
Xmo'd works by noticing when your
*.xcdatamodel is saved. If the model file's Xcode project item comment contains
xmod, an AppleScript is fired that creates a folder based on your model's file name and populates it with derived source code files from your model. It then adds the new folder to your project as a Group Reference and adds all the source files to your project.
-keyPathsForValuesAffectingValueForKey:is now generated in machine.m files, populated by your entity's scalar attributes. The idea is code like
myObject.myIntAttributeValue++tells Core Data that
myIntAttributehas changed (handy when you're KVO-observing
myIntAttribute). (Tony Arnold)
[NEW] When a model file has multiple versions (
.xcdatamodeldfiles) Xmo'd now uses the "current" version of the model (set the "xmod" command on the xcdatamodeld group). (Vincent Guerci)
[NEW] mogenerator and Xmo'd now supports model-relative paths for the
[NEW] Machine templates now include fetched properties by default. (Jonathan del Strother)
[NEW] Xmo'd: better support for
--(machine|human|output)-dirmodel option path: now they can be full or relative to the model file. Xcode group and file references are no longer deleted/re-added with every save. (John Turnipseed)
--log-commandmodel option. When enabled, Xmo'd will log (to Console.app) the generated+executed
mogeneratorinvocation. Good for automation debugging and also can provide training wheels for using mogenerator directly. (rentzsch)
nilsubstitution dictionary in generated fetch request wrapper code, which resulted in an
NSInvalidArgumentExceptionreason "Cannot substitute a nil substitution dictionary." (Anthony Mittaz)
[NEW] Xmo'd: model comments that start with
--are passed as args to mogenerator. This allows accessing command-line options such as
--base-class. (David LeBer)
[CHANGE] LLVM 2/Xcode 4 doesn't like
[NSDictionary dictionaryWithObjectsAndKeys:nil], issuing a "missing sentinel in method dispatch" warning. Add
prettyFetchRequestsso we can just generate
NSDictionary *substitutionVariables = nilin that case. (Anthony Mittaz)
[FIX] Variable shadowing bug which would cause v1.19's
xcode-selectfunctionality to always fail. (Nikita Zhuk)
- [NEW] Use
xcode-selectto dynamically discover our way to
momcinstead of only hard-coding
/Developer. (Josh Abernathy)
[NEW] Xmo'd works with versioned data models. (rentzsch)
[NEW] Support for fetched properties (Nikita Zhuk)
NSParameterAssert(moc)in fetch request wrappers. (rentzsch)
--list-source-filesoption, which lists model-related source files. (rentzsch)
--model to get a listing of source files that no longer have corresponding entities in the model. The intent is to be able to pipe its output to xargs + git to remove deleted and renamed entities in one command, something like:
$ mogenerator --model ../MyModel.xcdatamodel --orphaned | xargs git rm
[NEW] machine.h template now produces type-safe scalar attribute property declarations. (rentzsch)
[CHANGE] Remove machine.m implementations of to-many relationship setters. (rentzsch)
[CHANGE] Xmo'd: change file ordering to human.m, human.h, machine.m, machine.h (from human.h, human.m, machine.h, machine.m). (rentzsch)
[FIX] Missing space for fetch requests with multiple bindings. (Frederik Seiffert)
[CHANGE] Xmo'd: now adds
.hhuman+machine header files to project (in addition to current
[NEW] Now supports key paths in fetch request predicates so long as they're relationships. (Jon Olson)
[FIX] Log fetch-request-wrapper errors to
NSLog()on iPhone since it lacks
-[NSApp presentError:]. (rentzsch)
IMPORTANT: 1.14 generates code that may be incompatible with clients of 1.13-or-earlier generated code.
+newInManagedObjectContext:has been replaced with
+insertInManagedObjectContext:and method implementations have been replaced with
@dynamic, which don't work so well with overriding (most of these uses can be replaced with Cocoa Bindings). Upgrade only if you have spare cycles to fix-up existing projects.
+insertInManagedObjectContext:to satisfy the LLVM/clang static analyser. (Ruotger Skupin)
[CHANGE] Default machine templates now use @dynamic. The old templates still available in
contributed templates/rentzsch non-dynamic. (Pierre Bernard)
[CHANGE] Xmo'd included again in default mogenerator installation -- the first time since 1.6. (rentzsch)
[CHANGE] Migrated project to github from self-hosted svn+trac installation.
[NEW] Xmo'd version checking whitelists Xcode versions 3.1(.x) and 3.2(.x).
[NEW] Dropped ppc support for Xmo'd. May reconsider if folks yelp. (rentzsch)