Visit the project's pretty homepage.
Here's mogenerator's elevator pitch:
mogenerator
is a command-line tool that, given an.xcdatamodel
file, 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
, subclasses_MyEntity
, won't ever be overwritten and is a great place to put your custom logic.
Want more detail? John Blanco has authored a detailed writeup about mogenerator.
Senseful wrote up a nice summary of mogenerator's command-line options.
v1.30.1: Thu Apr 7 2016 download
-
[FIX] Use
will
/didChange
&will
/didAccess
in generated code when usingscalarsWhenNonOptional
. (rentzsch) -
[FIX] Only use
@import
if supported (which Objective-C++ does not). issue 325 (Samuel Bichsel) -
[FIX] Add space between property type and name. issue 323 (Daniel Rodríguez Troitiño)
v1.30: Mon Mar 21 2016 download
Thanks to lieutenant Justin Williams for helping with this release.
-
[NEW] Official bundled Swift 2 templates. (Justin Williams 1 2)
-
[NEW] "Modern" Objective-C and Swift is default. Apple has made it exceptionally difficult to target older versions of OS X and iOS, so we've given up. The grand
--v2
experiment, which I loved, has been killed (the option will still be accepted to not break existing scripts but is now a no-op). From now on if you need to target an older OS, use an older mogenerator. Sorry. (Justin Williams) -
[NEW] Generate Objective-C Lightweight Generics. (rentzsch)
-
[NEW] Generate
instancetype
. (Justin Williams) -
[NEW] Generate nullability attributes for Objective-C machine templates (
NS_ASSUME_NONNULL_BEGIN
/nullable
). (Justin Williams) -
[NEW] mogenerator project is now using Travis CI. Travis automatically builds and runs mogenerator's test suite on each commit, reporting the results, making it easier+faster to process Pull Requests. (rentzsch)
-
[NEW] Change of branch philosophy: master used to be the "stable" branch. Now it's the branch we're going to land incoming Pull Requests. Pull Requests will be accepted onto master pretty freely, Travis will help catch breaking changes. I want to reduce latency and friction for folks to help out with mogenerator. Related reading: Drew Crawford's Conduct unbecoming of a hacker. (rentzsch)
-
[NEW] Specifying
--template-var scalarsWhenNonOptional=true
will have mogenerator generate only scalar properties for non-optional entity scalar attributes. For example, consider anage
attribute. Without this option, mogenerator will generate two properties:@property (…) NSNumber *age
and@property (…) uint16_t ageValue
. With this option, only@property (…) uint16_t age
would be generated, simplifying things since the age attribute can never benil
. (Mr Anonymous) -
[CHANGE] Replace Mike Ash-style constant structures in favor of more ARC-friendly NSObject subclasses. Should be source-compatible with with Mike Ash-style. (Justin Williams)
-
[FIX] You can specify an entity's module in Xcode's Core Data Model editor. However, when specifying the current module, the entity class name is prefixed with a period, resulting in an invalid class name. This period is now suppressed. (Saul Mora)
-
[FIX] momcom:
NSPropertyDescription
'soptional
wasn't being set correctly. issue 286 (Matthias Bauch) -
[FIX] override and explicitly include
xcshareddata
in.gitignore
and add the default shared schemes. This fixes the problem wherexcodebuild
would fail with anThe project 'mogenerator' does not contain a scheme named 'mogenerator'
error until you first opened it in Xcode. (rentzsch) -
[FIX] Generated indentation. (Markus Chmelar 1 2)
-
[FIX] Use
DERIVED_FILE_DIR
instead ofTMPDIR
. (Jonathan MacMillan) -
[CHANGE] Move the constant structures to the end of the machine header file. It's just uninteresting support code. (rentzsch)
-
[MODERNIZE] MiscMerge: switch to Objective-C Modules. (Justin Williams)
-
[MODERNIZE] Use instancetype internally. (Justin Williams)
-
[MODERNIZE] 64-bit only. (Justin Williams)
-
[MODERNIZE] Replace
nsenumerate
macro withfor...in
. (Justin Williams) -
[MODERNIZE] MiscMerge: encode all source files as UTF8. (Justin Williams)
-
[MODERNIZE] Set minimum deployment target to 10.8. (Justin Williams)
-
[MODERNIZE] Replace RegexKitLite with NSRegularExpression. (Justin Williams)
-
[MODERNIZE] Replace
arrayWithObjects
anddictionaryWithObjectsAndKeys
with literals. (Markus Chmelar 1 2) -
[MODERNIZE] Replace
objectAtIndex:0
withfirstObject
. (Markus Chmelar) -
[REMOVED] //validate machine comments. They were just guides on writing your own validation methods and aren't worth the code clutter. (Justin Williams)
-
[REMOVED] Xmo'd. It hasn't worked for a very long time and I have no immediate plans on putting in the time to get working again. (Justin Williams)
v1.29: Thu Aug 20 2015 download
Much thanks to lieutenants Tom Harrington and Justin Williams for handling this release.
-
[NEW] Use built-in model compiler (momcom) instead of relying on Xcode's
momc
. (Tom Harrington) -
[NEW] Documentation generation using User Info keys. (Daniel Tull)
-
[NEW] Multiuser support (use per-user
$TMPDIR
instead of/tmp
). (Annard Brouwer) -
[NEW] Swift: support for additionalHeaderFileName. (Leonardo Yvens)
-
[CHANGE] Swift: make generated machine classes and their attributes public. (Fritz Anderson)
-
[CHANGE] Swift: make initializers public. (Dave Reed)
-
[CHANGE] Swift: make enums public. (Dave Reed)
-
[CHANGE] Swift: make mogenerator:readonly work for Swift by rendering the attribute as a read-only computed property. (Tom Harrington)
-
[CHANGE] Swift: method signatures for validate methods. issue 281. (Tom Harrington)
-
[FIX] Don't generate
-primativeType
and-setPrimativeType:
. issue 202. (rentzsch) -
[FIX] Swift: ordered relationships. issue 290. (Oleksii Taran, Tom Burns)
-
[FIX] Swift: model specified fetch requests. (Dave Reed, Tom Harrington)
-
[FIX] Swift: MogenSwiftTest. (Justin Williams, Dave Reed)
-
[FIX] Swift: generation of
override
method declarations. (Tom Harrington 1, 2) -
[FIX] Quote paths in test/Rakefile. (Jonah Williams)
v1.28: Wed Sep 10 2014 download
-
[NEW]
--v2
argument. I wanted to enable ARC by default, but decided to take it a step further (while not breaking existing scripts). The new--v2
argument is basically semantic versioning for tool arguments.So now instead of this:
mogenerator --model MyDataModel.xcdatamodeld \ --template-var arc=true \ --template-var literals=true \ --template-var modules=true
You can write this:
mogenerator --v2 --model MyDataModel.xcdatamodeld
Internally these invocations are equivalent, but new scripts and manual invocations should use the
--v2
variant.I recommend putting the
--v2
in front of the rest of the arguments to call attention to the versioned context of the following arguments.This mechanism should allow mogenerator to continue to supply sensible defaults into the future as well. Perhaps
--v3
will generate Swift by default. Speaking of which… -
[NEW] Experimental Swift code generation. Unfortunately basic Core Data functionality (to-one relationships) is broken on 10.9, but we can still try writing theoretically-correct Swift code. Perhaps a future version of mogenerator will supply the needed work-around code for you. (Alexsander Akers, afrederick1, Piet Brauer, rentzsch, Chris Weber, Markus Chmelar, Brent Royal-Gordon)
-
[NEW] Ordered relationships actually work. OMG. I have them working in a new separate OS X test app, even though mogenerator's test dir fails. I still haven't figured out why, but I'm not holding this back. (Daniel Tull, Joshua Greene, Dave Wood, Jonathan del Strother)
-
[NEW] Custom scalar types. Specify
attributeValueScalarType
for the name of the property's custom type andadditionalHeaderFileName
if you need to bring in an additional header file for compilation. With this, mogenerator supports C-style and JREnum-style enums. (Quentin ARNAULT) -
[NEW] Remove unnecessary empty lines in the generated files. (Stephan Michels)
-
[NEW] Ability to forward-declare
@protocol
s for i.e. transformable types. Specify them via a comma delimited string in the entity's user info under theattributeTransformableProtocols
key. (Renaud Tircher) -
[NEW] Generate
*UserInfo
key/value pairs as const structs. (Jeremy Foo, rentzsch) -
[NEW]
--template-var literals
which, when enabled, generates Obj-C literals. (Brandon Williams, Thomas van der Heijden, rentzsch) -
[NEW] Specify
--template-var modules=true
option to avoidtreating #import as an import of module 'CoreData' [-Wauto-import]" warning
. (Daniel Tull) -
[NEW] Unsigned integers are generated when a property's minimum is set to
0
in the Xcode modeler. (Dan Pourhadi) -
[NEW] Add support for setting command-line options via a JSON config file. (Simon Whitaker)
-
[NEW] Add CONTRIBUTING.md file. It's now even easier to contribute to mogenerator :) (rentzsch)
-
[NEW] Add MIT LICENSE file to make it clear templates are under the same license. (rentzsch)
-
[CHANGE] Suppress generation of
-setPrimativeType:
method. issue 16. (rentzsch) -
[CHANGE] Add a warning when skipping an attribute named 'type'. (Simon Whitaker)
-
[CHANGE] Add explicit
atomic
to sooth-Weverything
. (Daniel Tull) -
[CHANGE] iOS 8 changes objectID from a getter into a property, resulting in a warning. Templates updated to match. (Ryan Johnson)
-
[FIX] Support newly-created models when
--model=*.xcdatamodeld
. issue 137. (Sergey) -
[FIX] Minor warning fix, 64->32 truncation, format strings. (Sean M)
-
[FIX] Machine headers always
#import
s their superentity if present. (David Aspinall) -
[FIX] Fetch requests whose predicate LHS specifies a relationship. issue 15. (rentzsch)
-
[FIX] Don't emit empty
*Attributes
,*Relationships
, and*FetchedProperties
structs. (Daniel Tull) -
[FIX] MOIDs subclass their superentity (instead of just always inheriting from
NSManagedObject
). (Daniel Tull) -
[FIX] Don't touch aggregate include files if the content didn't change. (Stephan Michels)
-
[FIX] Don't attempt to
#import "NSManagedObject.h"
even in the face of weird (corrupted?) model files. issue 42. (rentzsch) -
[TEST] Escape spaces in mogenerator build path. (Daniel Tull)
v1.27: Mon Nov 12 2012 download
-
[NEW] You can now pass .xcdatamodeld paths to mogenerator. mogenerator will look inside the directory, read its hidden
.xccurrentversion
file and use the "current" .xcdatamodel file. (Alexander Zats) -
[NEW] Replaced mogenerator's previous testing system (the test mule) with a new Rakefile-based system that eases building & testing from the current source tree and tests both MRC and ARC. (rentzsch)
-
[NEW] Property declarations generated from attributes can now be qualified as readonly by adding a
mogenerator.readonly
to an attribute's userinfo. (crispinb) -
[NEW]
--configuration
option that limits generation to the specified configuration. (Sixten Otto) -
[NEW]
--base-class-import
option for fine-grained control of base class import statements. (David Aspinall) -
[CHANGE] Optimized
keyPathsForValuesAffectingValueForKey:
generated code (returns after first match). (Sean M) -
[CHANGE] Add default private class extension to human source template. (Jonas Schnelli)
-
[FIX] Align generated code's pointer asterisks more consistently. (Tony Arnold)
-
[FIX] Missing import when using mogenerator.customBaseClass entity userinfo key. (Thomas Guthrie)
-
[FIX] Handle case in generated fetch request wrapper machine code when predicate variables are repeated. (Sergei Winitzki)
-
[FIX] Explicitly set mogenerator project's deployment target to 10.6 to avoid segfaulting on 10.8 for some reason. issue 121 (reported by Sixten Otto, diagnosed by Florian Bürger)
-
[FIX] Cast to unsigned in machine source to avoid clang format string warning. (rentzsch)
-
[FIX] Don't attempt to report errors through -[NSApp reportError:] in generated machine source unless targeting AppKit. (rentzsch)
-
[WORKAROUND] Recent versions of Xcode use an empty string to mark entities that do not have a custom subclass. (Matthias Bauch)
-
[CHANGE] make_installer.command: assume PackageMaker now lives in /Applications/Utilities. (rentzsch)
v1.26: Thu Apr 12 2012 download
-
[FIX] Missing space in transformable attribute codegen. issue 89 (Daniel Tull, Kris Markel, Whitney Young)
-
[NEW] mogenerator's standard templates are now bundled into the mogenerator binary itself. This should solve the problem of templates growing out of sync with the intended version of mogenerator (exacerbated by the now-popular homebrew installer). You can still use your own templates with the
--template-path
and--template-group
parameters. issue 79 (Ingvar Nedrebo, rentzsch). -
[NEW] Support for per-entity custom base classes, set via
mogenerator.customBaseClass
key in the entity's user info. (Trevor Squires) -
[CHANGE] mogenerator installer no longer installs separate template files (but it won't touch those already installed).
-
[CHANGE] mogenerator's .pkg installer no longer includes Xmo'd since 1) Xmo'd doesn't work with Xcode 4 yet and 2) Xcode.app now lives in /Applications, so the installer needs to get smarter to cope.
v1.25: Thu Feb 16 2012 download
-
[NEW] Support for Xcode 4.3 and it's relocation of
momc
into its bundle. Only supports /Applications/Xcode.app for now. (Matt McGlincy) -
[CHANGE] Now generates size-specific scalar types (
int16_t
,int32_t
,int64_t
) instead of size-variable types (short
,int
,long long
). bug 2 (Rob Rix) -
[NEW] Can now generate
NSFetchedResultsController
creation code for to-many relationships (use--template-var frc=true
). (Daniel Tull) -
[DOC] Link to John Blanco's Getting Started with Mogenerator.
v1.24: Wed Dec 6 2011 download
-
[FIX] Was incorrectly using
-mutableSetValueForKey:
for ordered relationships instead of-mutableOrderedSetValueForKey:
. bug 75 (Martin Schürrer) -
[NEW] Now generates Mike Ash-style constant structures for attributes, relationships and fetched properties. This allows you to write code like
[obj valueForKey:PersonMOAttributes.age]
. Tip: you'll need to enable ARC generation (--template-var arc=true
) if you're using ARC. (Daniel Tull) -
[NEW]
--base-class-force
option, for specifying a base class even if the model file's entities don't specify one. (Joe Carroll) -
[NEW] PONSO: NSSet-based templates, improved inverse relationship logic and plug memory leak. (Tyrone Trevorrow)
-
[FIX] PONSO: Added import for super entity in machine headers. (Tyrone Trevorrow)
-
[FIX] Migrate from deprecated
-[NSString initWithContentsOfFile:]
and fix a MiscMerge warning where an immutable object was assigned to a mutable ivar. (Joshua Smith)
v1.23: Sun Jul 10 2011 download
-
[NEW] Support for Mac OS X 10.7 Lion's ordered relationships (generated relationship code uses
NSOrderedSet
andNSMutableOrderedSet
). (rentzsch 1 2 3) -
[NEW] Optional support for ARC: pass
--template-var arc=true
to mogenerator. bug 63 (Adam Cox) -
[NEW] New template that dumps a binary .xcdatamodel into a pseudo-ASCII-plist format perfect for diffing. A great way to compare two versions of a data model. (Brian Webster)
-
[NEW] Attributes and relationships are now sorted for generation. This should eliminate spurious changes to source files when unrelated model entities are changed. After upgrading to 1.23 you probably want to regenerate all your source files without a model change, just to let things settle in before your next real model change. (Nikita Zhuk)
-
[NEW] Support for generation of PONSOs: Plain Old NSObjects. These are in-memory, typesafe non-CoreData classes generated from your Xcode data models. Generate reams of ObjC classes from a single data model. Supports relationships and basic serialization. See
contributed templates/Nikita Zhuk/ponso/README.txt
for details. (Nikita Zhuk) -
[NEW] Support for
momc
error-reporting options:MOMC_NO_WARNINGS
,MOMC_NO_INVERSE_RELATIONSHIP_WARNINGS
andMOMC_SUPPRESS_INVERSE_TRANSIENT_ERROR
. (Nikita Zhuk) -
[NEW] Now generates output directories if they don't already exist or presents an error message if they cannot be created. (Scott Little)
-
[CHANGE] Change
#include
to#import
ininclude.m
. (Zac Bowling) -
[NEW] You can now use
--template-var
to pass arbitrary command-line options through to templates. (Adam Cox) -
[NEW] Update MiscMerge to NS(U)Integer for 64-bit compatibility. (Nikita Zhuk)
-
[FIX] Memory leaks in MiscMerge. (Nikita Zhuk)
-
[CHANGE] mogeneratorTestMule's
mogenerate.command
upgraded to use double-dash option names. (rentzsch) -
[FIX] Set mogeneratorTestMule's
mogenerate.command
executable bit. (rentzsch)
v1.22: Wed Mar 2 2011 download
-
[FIX] Xmo'd 1.21 introduced a bug where it would no longer create a source folder for your data model (it would work fine it one already existed). bug 43 (rentzsch)
-
[NEW]
-keyPathsForValuesAffectingValueForKey:
is now generated in machine.m files, populated by your entity's scalar attributes. The idea is code likemyObject.myIntAttributeValue++
tells Core Data thatmyIntAttribute
has changed (handy when you're KVO-observingmyIntAttribute
). (Tony Arnold) -
[NEW] When a model file has multiple versions (
.xcdatamodeld
files) Xmo'd now uses the "current" version of the model (set the "xmod" command on the xcdatamodeld group). (Vincent Guerci) -
[NEW] Support undefined attribute types. (Brian Doig)
-
[NEW] mogenerator and Xmo'd now supports model-relative paths for the
--template-path
argument. (tonklon)
v1.21: Mon Nov 1 2010 download
-
[NEW] Machine templates now include fetched properties by default. (Jonathan del Strother)
-
[NEW] Xmo'd: better support for
--(machine|human|output)-dir
model 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) -
[NEW] Xmo'd:
--log-command
model option. When enabled, Xmo'd will log (to Console.app) the generated+executedmogenerator
invocation. Good for automation debugging and also can provide training wheels for using mogenerator directly. (rentzsch) -
[FIX] Avoid
nil
substitution dictionary in generated fetch request wrapper code, which resulted in anNSInvalidArgumentException
reason "Cannot substitute a nil substitution dictionary." (Anthony Mittaz)
v1.20: Thu Aug 12 2010 download
-
[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) -
[NEW] Forward-declare transformable attribute class types. bug 11 (seanm)
-
[CHANGE] Generated accessors that return
BOOL
s now returnNO
instead of0
, avoiding LLVM Static Analyzer warnings. bug 8 (seanm) -
[CHANGE] Generated value accessors that return
int
s no longer needlessly check for nil. bug 10 (seanm) -
[CHANGE] LLVM 2/Xcode 4 doesn't like
[NSDictionary dictionaryWithObjectsAndKeys:nil]
, issuing a "missing sentinel in method dispatch" warning. AddhasBindings
toprettyFetchRequests
so we can just generateNSDictionary *substitutionVariables = nil
in that case. (Anthony Mittaz) -
[FIX] Variable shadowing bug which would cause v1.19's
xcode-select
functionality to always fail. (Nikita Zhuk)
v1.19: Sun 4 Jul 2010 download
- [NEW] Use
xcode-select
to dynamically discover our way tomomc
instead of only hard-coding/Developer
. (Josh Abernathy)
v1.18: Thu 1 Jul 2010 download
-
[NEW] Xmo'd works with versioned data models. (rentzsch)
-
[NEW] Support for fetched properties (Nikita Zhuk)
-
[NEW]
NSParameterAssert(moc)
in fetch request wrappers. (rentzsch)
v1.17: Sat 27 Mar 2010 download
-
[NEW]
+[Machine entityName]
(for @drance) and+[Machine entityInManagedObjectContext:]
(Michael Dales). -
[NEW]
--list-source-files
option, which lists model-related source files. (rentzsch) -
[NEW] Add
--orphaned
option. (rentzsch)
Couple --orphaned
with --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
v1.16: Mon 4 Jan 2010 download
-
[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)
v1.15: Mon 2 Nov 2009 download
-
[CHANGE] Xmo'd: now adds
.h
human+machine header files to project (in addition to current.m
+.mm
files). (rentzsch) -
[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) -
[NEW]
+insertInManagedObjectContext:
NSParameterAssert()
's itsmoc
arg. (rentzsch)
v1.14: Fri 9 Oct 2009 download
-
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. -
[CHANGE] changed
+newInManagedObjectContext:
to+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)