Author: ianb
Date: 2005-05-20 23:21:26 +0000 (Fri, 20 May 2005)
New Revision: 795
Modified:
trunk/SQLObject/sqlobject/manager/command.py
Log:
Added --edit option to record, so you can immediately create an upgrade script
Modified: trunk/SQLObject/sqlobject/manager/command.py
===================================================================
--- trunk/SQLObject/sqlobject/manager/command.py 2005-05-20 22:54:07 UTC (rev 794)
+++ trunk/SQLObject/sqlobject/manager/command.py 2005-05-20 23:21:26 UTC (rev 795)
@@ -5,6 +5,7 @@
import os
import sys
import textwrap
+import warnings
try:
from paste import pyconfig
from paste import CONFIG
@@ -18,6 +19,14 @@
from sqlobject.util import moduleloader
from sqlobject.declarative import DeclarativeMeta
+# It's not very unsafe to use tempnam like we are doing:
+warnings.filterwarnings(
+ 'ignore', 'tempnam is a potential security risk.*',
+ RuntimeWarning, '.*command', 28)
+
+def nowarning_tempnam(*args, **kw):
+ return os.tempnam(*args, **kw)
+
class SQLObjectVersionTable(sqlobject.SQLObject):
"""
This table is used to store information about the database and
@@ -321,6 +330,28 @@
fn = fn[len(os.getcwd())+1:]
return fn
+ def open_editor(self, pretext, breaker=None, extension='.txt'):
+ """
+ Open an editor with the given text. Return the new text,
+ or None if no edits were made. If given, everything after
+ `breaker` will be ignored.
+ """
+ fn = nowarning_tempnam() + extension
+ f = open(fn, 'w')
+ f.write(pretext)
+ f.close()
+ print '$EDITOR %s' % fn
+ os.system('$EDITOR %s' % fn)
+ f = open(fn, 'r')
+ content = f.read()
+ f.close()
+ if breaker:
+ content = content.split(breaker)[0]
+ pretext = pretext.split(breaker)[0]
+ if content == pretext or not content.strip():
+ return None
+ return content
+
class CommandSQL(Command):
name = 'sql'
@@ -617,6 +648,11 @@
"this tool, to create a 'beginning' revision.",
metavar="VERSION_NAME",
dest="force_db_version")
+ parser.add_option('--edit',
+ help="Open an editor for the upgrader in the last "
+ "version (using $EDITOR).",
+ action="store_true",
+ dest="open_editor")
version_regex = re.compile(r'^\d\d\d\d-\d\d-\d\d')
@@ -721,6 +757,24 @@
elif self.options.db_record:
for conn in conns:
self.update_db(version, conn)
+ if self.options.open_editor:
+ if not last_version_dir:
+ print ("Cannot edit upgrader because there is no "
+ "previous version")
+ else:
+ breaker = ('-'*20 + ' lines below this will be ignored '
+ + '-'*20)
+ pre_text = breaker + '\n' + '\n'.join(all_diffs)
+ text = self.open_editor('\n\n' + pre_text, breaker=breaker,
+ extension='.sql')
+ if text is not None:
+ fn = os.path.join(last_version_dir,
+ 'upgrade_%s_%s.sql' %
+ (dbName, version))
+ f = open(fn, 'w')
+ f.write(text)
+ f.close()
+ print 'Wrote to %s' % fn
def update_db(self, version, conn):
v = self.options.verbose
@@ -910,7 +964,7 @@
dbname, target_dbname)
continue
if version > dest:
- if self.verbose > 1:
+ if self.options.verbose > 1:
print 'Version too new: %s (only want %s)' % (
version, dest)
upgraders.append((version, os.path.join(current_dir, fn)))
|