Changeset 1328:6cc7867ababe
- Timestamp:
- 01/10/10 17:25:18 (2 years ago)
- Branch:
- default
- Files:
-
- 6 edited
-
external-plugins/eric_the_fish/__init__.py (modified) (1 diff)
-
scripts/manage-database (modified) (1 diff)
-
zine/application.py (modified) (8 diffs)
-
zine/upgrades/__init__.py (modified) (15 diffs)
-
zine/upgrades/customisation.py (modified) (6 diffs)
-
zine/upgrades/versions/__init__.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
external-plugins/eric_the_fish/__init__.py
r1327 r1328 130 130 """ 131 131 132 # we need to register eric's database upgrades repository;133 # Basically it should be a folder which itself has another child folder134 # named "versions" where the upgrade script(s) should reside.135 # In "Eric the fish" case we pass the plugin's folder which has that child136 # folder called "versions"132 # since this plugin also shows how to do data migration, we need to register 133 # eric's database upgrades repository. Basically it should be a directory 134 # which itself has a subdirectory named "versions" where the upgrade 135 # script(s) reside. In Eric's case we pass the plugin's directory which has 136 # that subdirectory called "versions". 137 137 app.register_upgrade_repository(plugin, dirname(__file__)) 138 138 -
scripts/manage-database
r1327 r1328 10 10 :license: BSD, see LICENSE for more details. 11 11 """ 12 # for now 13 import warnings 14 warnings.filterwarnings('ignore') 12 15 13 16 import sys -
zine/application.py
r1327 r1328 18 18 from inspect import getdoc 19 19 from traceback import format_exception 20 from pprint import pprint21 20 from StringIO import StringIO 22 21 … … 834 833 self.list_parsers() 835 834 836 # Register Zine's upgrade repository835 # register Zine's upgrade repository 837 836 from zine.upgrades import REPOSITORY_PATH 838 837 self.register_upgrade_repository('Zine', REPOSITORY_PATH) 839 # Allow plugins to register their upgrade'srepositories838 # allow plugins to register their upgrade repositories 840 839 emit_event('register-upgrade-repository') 841 840 … … 861 860 db.session.commit() 862 861 except (SQLAlchemyError, AttributeError): 863 # The schema_versions table does not yet exist. Let's create it862 # the schema_versions table does not yet exist, let's create it 864 863 db.session.rollback() 865 864 from zine.database import metadata, schema_versions … … 870 869 db.session.commit() 871 870 872 873 871 @property 874 872 def upgrade_required(self): … … 881 879 self.repository_has_upgrade(repository, sv) 882 880 except _core.InstanceUpgradeRequired: 883 # Set Zine in maintenance mode881 # set Zine in maintenance mode 884 882 cfg = self.cfg.edit() 885 883 cfg['maintenance_mode'] = True … … 887 885 raise _core.InstanceUpgradeRequired() 888 886 889 # We got here, let's check for a bad upgrade lockfile left behind887 # we got here, let's check for a bad upgrade lockfile left behind 890 888 if path.isfile(self.upgrade_lockfile): 891 889 remove(self.upgrade_lockfile) 892 890 893 891 def repository_has_upgrade(self, repository, schema_version): 892 from zine.models import SchemaVersion 894 893 try: 895 894 if schema_version.version < repository.latest: … … 898 897 self.log.error('WE EVEN GOT HERE??? schema_versions table does not ' 899 898 'yet exist at this stage?') 900 # The schema_versions table does not yet exist. Let's create it899 # the schema_versions table does not yet exist, let's create it 901 900 db.session.rollback() 902 901 from zine.database import metadata, schema_versions … … 904 903 if not schema_versions.exists(): 905 904 schema_versions.create(self.database_engine) 906 db.session.add(SchemaVersion( Repository(repo_path)))905 db.session.add(SchemaVersion(repository)) 907 906 db.session.commit() 908 907 raise _core.InstanceUpgradeRequired() -
zine/upgrades/__init__.py
r1327 r1328 9 9 :license: BSD, see LICENSE for more details. 10 10 """ 11 12 11 import re 13 12 import sys … … 22 21 "system.") 23 22 24 from migrate.versioning import api , exceptions23 from migrate.versioning import api 25 24 from migrate.versioning.util import construct_engine 25 from migrate.versioning.exceptions import KnownError 26 26 from zine import __version__ as VERSION, setup 27 # imported for side-effects 27 28 from zine.upgrades import customisation 28 29 … … 31 32 class CommandLineInterface(object): 32 33 33 usage = '%%prog %s [options] %s'34 usage = '%%prog -I instancepath %s [options] %s' 34 35 cmdline_version = '%%prog %s' % VERSION 35 36 36 37 commands = { 38 'help': 'Show help.', 39 'list': 'List all repositories.', 37 40 'script': 'Create an empty upgrade script.', 38 41 'upgrade': 'Upgrade a database to a later version.', … … 48 51 version=self.cmdline_version) 49 52 self.parser.disable_interspersed_args() 50 self.parser.print_help = self._ help53 self.parser.print_help = self._general_help 51 54 self.parser.add_option('-I', '--instance', dest='instance', 52 help=" zine instance folder")55 help="Zine instance path") 53 56 54 57 options, args = self.parser.parse_args(argv[1:]) 55 58 56 self.instance_ folder= options.instance59 self.instance_path = options.instance 57 60 58 61 if not args: … … 66 69 67 70 def get_zine_instance(self): 68 if not self.instance_folder: 69 self.parser.error('You need to pass the path to your zine\'s ' 70 ' instance folder') 71 if not self.instance_path: 72 self.parser.error('you need to pass your Zine instance path.') 71 73 if not hasattr(self, 'zine_instance'): 72 self.zine_instance = setup(expanduser(self.instance_ folder))74 self.zine_instance = setup(expanduser(self.instance_path)) 73 75 return self.zine_instance 74 76 75 def _ help(self):77 def _general_help(self): 76 78 print self.parser.format_help() 77 79 print "commands:" … … 80 82 for name, description in self.commands.items(): 81 83 print format % (name, description) 84 85 def help(self, argv): 86 self._general_help() 82 87 83 88 def cmdlogger(self, messages): … … 90 95 message = parse_html(message).to_text(simple=True) 91 96 if message: 97 # make the textifier output more compact 92 98 if message.endswith('\n\n') and trailing_new_line: 93 99 message = message[:-1] … … 96 102 sys.stdout.write(message.encode('utf-8')) 97 103 sys.stdout.flush() 104 105 def list(self, argv): 106 self.get_zine_instance() 107 def list_them(): 108 from zine.models import SchemaVersion 109 available_svs = SchemaVersion.query.all() 110 yield '<h2>Available repositories</h2>\n' 111 yield '<ul>' 112 for sv in available_svs: 113 yield '<li>' + sv.repository_id + '</li>\n' 114 yield '</ul>\n' 115 self.cmdlogger(list_them()) 98 116 99 117 def script(self, argv): … … 104 122 parser.add_option( 105 123 '-f', '--filename', 106 help="file name name(without spaces and/or version number)")124 help="file name (without spaces and/or version number)") 107 125 options, args = parser.parse_args(argv) 108 126 description = ' '.join(args) … … 112 130 113 131 def upgrade(self, argv): 114 parser = OptionParser(usage=self.usage % ('upgrade', '[ VERSION]'),132 parser = OptionParser(usage=self.usage % ('upgrade', '[REPO] [VERSION]'), 115 133 description=self.commands['upgrade']) 116 134 parser.add_option('--echo', default=False, action='store_true', 117 135 help='echo the SQL statements') 118 136 options, args = parser.parse_args(argv) 137 repo = args and args.pop(0) or None 119 138 version = args and args.pop(0) or None 120 139 manage = ManageDatabase(self.get_zine_instance()) 121 self.cmdlogger(manage.cmd_upgrade( version, echo=options.echo))140 self.cmdlogger(manage.cmd_upgrade(repo, version, echo=options.echo)) 122 141 123 142 def downgrade(self, argv): 124 parser = OptionParser(usage=self.usage % ('downgrade', ' VERSION'),143 parser = OptionParser(usage=self.usage % ('downgrade', 'REPO [VERSION]'), 125 144 description=self.commands['downgrade']) 126 145 parser.add_option('--echo', default=False, action='store_true', 127 146 help='echo the SQL statements') 128 147 options, args = parser.parse_args(argv) 148 try: 149 repo = args.pop(0) 150 except IndexError: 151 parser.error('you need to pass the repository id for downgrades, ' 152 'see the list command.') 129 153 version = args and args.pop(0) or None 130 154 manage = ManageDatabase(self.get_zine_instance()) 131 try: 132 self.cmdlogger(manage.cmd_downgrade(version, echo=options.echo)) 133 except ValueError: 134 self.cmdlogger(['No more downgrades avaialable']) 135 136 137 # Database maintenance class 155 self.cmdlogger(manage.cmd_downgrade(repo, version, echo=options.echo)) 156 157 138 158 class ManageDatabase(object): 159 """Database maintenance class.""" 139 160 140 161 def __init__(self, instance): … … 163 184 api.PythonScript.create(new_script_path, description=description) 164 185 165 166 def cmd_upgrade(self, version=None, **opts): 186 def cmd_upgrade(self, repo_id=None, version=None, **opts): 167 187 """Upgrade a database to a later version. 168 188 … … 176 196 """ 177 197 from zine.models import SchemaVersion 178 available_svs = SchemaVersion.query.all() 179 # Zine upgrade's come first 180 for sv in available_svs[:]: 181 available_svs.insert(0, available_svs.pop(available_svs.index(sv))) 198 if repo_id is None: 199 available_svs = SchemaVersion.query.all() 200 # Zine upgrades come first (XXX make that happen) 201 #for sv in available_svs[:]: 202 # available_svs.insert(0, available_svs.pop(available_svs.index(sv))) 203 else: 204 available_svs = [SchemaVersion.query.get(repo_id)] 182 205 # Now, run the available schema version upgrades 183 206 for sv in available_svs: 184 repository = api.Repository(sv.repository_path, sv.repository_id) 185 for message in self._migrate(repository, version, upgrade=True, 186 **opts): 187 yield message 188 189 190 def cmd_downgrade(self, version=None, **opts): 207 try: 208 repository = api.Repository(sv.repository_path, sv.repository_id) 209 for message in self._migrate(repository, version, 210 upgrade=True, **opts): 211 yield message 212 except Exception, msg: 213 yield '<p>error upgrading %s: ' % repo_id 214 yield str(msg) 215 yield '</p>\n' 216 217 def cmd_downgrade(self, repo_id, version=None, **opts): 191 218 """Downgrade a database to an earlier version. 192 219 … … 198 225 """ 199 226 from zine.models import SchemaVersion 200 for sv in SchemaVersion.query.all(): 201 repository = api.Repository(sv.repository_path, sv.repository_id) 202 if version is None: 203 version = repository.version -1 204 for message in self._migrate(repository, version, upgrade=False, 205 **opts): 227 sv = SchemaVersion.query.get(repo_id) 228 repository = api.Repository(sv.repository_path, sv.repository_id) 229 if version is None: 230 version = sv.version - 1 231 try: 232 for message in self._migrate(repository, version, 233 upgrade=False, **opts): 206 234 yield message 207 235 except Exception, msg: 236 yield '<p>error downgrading %s: ' % repo_id 237 yield str(msg) 238 yield '</p>\n' 208 239 209 240 def _migrate(self, repository, version, upgrade, **opts): … … 213 244 214 245 changeset = schema.changeset(version) 215 if changeset: 216 yield '<h2>Upgrading %s</h2>\n' % repository.id 246 if not changeset: 247 yield '<p>Repository %s is already up to date.</p>\n' % repository.id 248 return 249 250 yield '<h2>Migrating %s</h2>\n' % repository.id 217 251 for ver, change in changeset: 218 252 nextver = ver + changeset.step … … 222 256 for message in schema.runchange(ver, change, changeset.step): 223 257 yield message 224 yield 'done\n\n\n' 225 258 yield '\n<p>Done!</p>\n' 226 259 227 260 def _migrate_version(self, schema, version, upgrade): 228 261 if version is None: 229 262 return version 263 if version < 0: 264 raise KnownError("Already at version 0.") 230 265 # Version is specified: ensure we're upgrading in the right direction 231 266 # (current version < target version for upgrading; reverse for down) 232 267 version = api.VerNum(version) 233 268 cur = schema.version 234 if upgrade is not None: 269 if upgrade: 270 direction = cur <= version 271 else: 272 direction = cur >= version 273 if not direction: 274 msg = ("Cannot %s a database of version %%s to version %%s. " 275 "Try '%s' instead.") 235 276 if upgrade: 236 direction = cur <= version277 msg = msg % ('upgrade', 'downgrade') 237 278 else: 238 direction = cur >= version 239 if not direction: 240 err = "Cannot % a database of version %%s to version %%s. "\ 241 "Try '%s' instead.\n" 242 if upgrade: 243 err = err % ('upgrade', 'downgrade') 244 else: 245 err = err % ('downgrade', 'upgrade') 246 raise exceptions.KnownError(err%(cur, version)) 279 msg = msg % ('downgrade', 'upgrade') 280 raise KnownError(msg % (cur, version)) 247 281 return version -
zine/upgrades/customisation.py
r1327 r1328 31 31 """Create an empty migration script at specified path 32 32 33 :returns: :class:`PythonScript instance <migrate.versioning.script.py.PythonScript>`""" 33 :returns: :class:`PythonScript instance 34 <migrate.versioning.script.py.PythonScript>` 35 """ 34 36 cls.require_notfound(path) 35 37 … … 66 68 67 69 """ 68 open(path, 'w').write(NEW_SCRIPT_TEMPLATE % opts.get('description', '')) 70 open(path, 'w').write(NEW_SCRIPT_TEMPLATE % 71 opts.get('description', ' ')) 69 72 return cls(path) 70 73 … … 228 231 self._init_parent(repository_path) 229 232 # __init__ from Repository 230 self.versions =Collection(join(repository_path, 'versions'))233 self.versions = Collection(join(repository_path, 'versions')) 231 234 self.config['repository_id'] = repository_id 232 235 … … 236 239 237 240 def changeset(self, database, start, end=None): 238 """Create a changeset to migrate this database from ver. start to end/latest. 241 """Create a changeset to migrate this database from version 242 start to end/latest. 239 243 240 244 :param database: name of database to generate changeset … … 244 248 :type start: int 245 249 :type end: int 246 :returns: :class:`Changeset instance <migration.versioning.repository.Changeset>` 250 :returns: :class:`Changeset instance 251 <migration.versioning.repository.Changeset>` 247 252 """ 248 253 start = api.VerNum(start) … … 264 269 versions = range(start + range_mod, end + range_mod, step) 265 270 changes = [] 266 for version in range(start + range_mod, end + range_mod, step):271 for version in versions: 267 272 try: 268 273 changes.append(self.version(version).script(database, op)) -
zine/upgrades/versions/__init__.py
r1327 r1328 3 3 ~~~~~~~~~~~~~~~~~~~~~~ 4 4 5 This package implements contains the necessary upgrade/downgrade scripts6 t o maintain the database schema changes.5 This package contains the necessary upgrade/downgrade scripts to maintain 6 the database schema changes. 7 7 8 8 :copyright: (c) 2010 by the Zine Team, see AUTHORS for more details.
Note: See TracChangeset
for help on using the changeset viewer.