ProjectFlask/FlaskMigrateExtension/MigrateProjectExtension.py

branch
eric7
changeset 70
22e1d0f69668
parent 66
0d3168d0e310
child 72
4557829a4acf
--- a/ProjectFlask/FlaskMigrateExtension/MigrateProjectExtension.py	Thu Dec 30 12:13:22 2021 +0100
+++ b/ProjectFlask/FlaskMigrateExtension/MigrateProjectExtension.py	Wed Sep 21 16:30:15 2022 +0200
@@ -27,10 +27,11 @@
     """
     Class implementing the flask-migrate project support.
     """
+
     def __init__(self, plugin, project, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type ProjectFlaskPlugin
         @param project reference to the project object
@@ -39,188 +40,235 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__plugin = plugin
         self.__project = project
-        
+
         self.__ericProject = ericApp().getObject("Project")
-        
+
         self.__migrationSummaryDialog = None
-    
+
     def initActions(self):
         """
         Public method to define the flask-migrate actions.
         """
         self.actions = []
-        
+
         self.migrateConfigAct = EricAction(
-            self.tr('Configure Migrate'),
-            self.tr('C&onfigure Migrate'),
-            0, 0,
-            self, 'flask_config_migrate')
-        self.migrateConfigAct.setStatusTip(self.tr(
-            'Shows a dialog to edit the configuration for flask-migrate'))
-        self.migrateConfigAct.setWhatsThis(self.tr(
-            """<b>Configure Migrate</b>"""
-            """<p>Shows a dialog to edit the configuration for"""
-            """ flask-migrate.</p>"""
-        ))
-        self.migrateConfigAct.triggered.connect(
-            self.__configureMigrate)
+            self.tr("Configure Migrate"),
+            self.tr("C&onfigure Migrate"),
+            0,
+            0,
+            self,
+            "flask_config_migrate",
+        )
+        self.migrateConfigAct.setStatusTip(
+            self.tr("Shows a dialog to edit the configuration for flask-migrate")
+        )
+        self.migrateConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Configure Migrate</b>"""
+                """<p>Shows a dialog to edit the configuration for"""
+                """ flask-migrate.</p>"""
+            )
+        )
+        self.migrateConfigAct.triggered.connect(self.__configureMigrate)
         self.actions.append(self.migrateConfigAct)
-        
+
         self.migrateInstallAct = EricAction(
-            self.tr('Install flask-migrate'),
-            self.tr('Install &flask-migrate'),
-            0, 0,
-            self, 'flask_install_migrate')
-        self.migrateInstallAct.setStatusTip(self.tr(
-            'Installs the flask-migrate extension into the configured'
-            ' environment'))
-        self.migrateInstallAct.setWhatsThis(self.tr(
-            """<b>Install flask-migrate</b>"""
-            """<p>Installs the flask-migrate extension into the configured"""
-            """ environment using the pip interface.</p>"""
-        ))
-        self.migrateInstallAct.triggered.connect(
-            self.__installFlaskMigrate)
+            self.tr("Install flask-migrate"),
+            self.tr("Install &flask-migrate"),
+            0,
+            0,
+            self,
+            "flask_install_migrate",
+        )
+        self.migrateInstallAct.setStatusTip(
+            self.tr(
+                "Installs the flask-migrate extension into the configured"
+                " environment"
+            )
+        )
+        self.migrateInstallAct.setWhatsThis(
+            self.tr(
+                """<b>Install flask-migrate</b>"""
+                """<p>Installs the flask-migrate extension into the configured"""
+                """ environment using the pip interface.</p>"""
+            )
+        )
+        self.migrateInstallAct.triggered.connect(self.__installFlaskMigrate)
         self.actions.append(self.migrateInstallAct)
-        
+
         self.migrateAvailabilityAct = EricAction(
-            self.tr('Check flask-migrate Availability'),
-            self.tr('Check flask-migrate &Availability'),
-            0, 0,
-            self, 'flask_check_migrate')
-        self.migrateAvailabilityAct.setStatusTip(self.tr(
-            'Check the availability of the flask-migrate extension'))
-        self.migrateAvailabilityAct.setWhatsThis(self.tr(
-            """<b>Check flask-migrate Availability</b>"""
-            """<p>Check the availability of the flask-migrate extension.</p>"""
-        ))
-        self.migrateAvailabilityAct.triggered.connect(
-            self.__checkAvailability)
+            self.tr("Check flask-migrate Availability"),
+            self.tr("Check flask-migrate &Availability"),
+            0,
+            0,
+            self,
+            "flask_check_migrate",
+        )
+        self.migrateAvailabilityAct.setStatusTip(
+            self.tr("Check the availability of the flask-migrate extension")
+        )
+        self.migrateAvailabilityAct.setWhatsThis(
+            self.tr(
+                """<b>Check flask-migrate Availability</b>"""
+                """<p>Check the availability of the flask-migrate extension.</p>"""
+            )
+        )
+        self.migrateAvailabilityAct.triggered.connect(self.__checkAvailability)
         self.actions.append(self.migrateAvailabilityAct)
-        
+
         #########################################################
         ## action to initialize the database migration system
         #########################################################
-        
+
         self.migrateInitAct = EricAction(
-            self.tr('Initialize Migrations'),
-            self.tr('&Initialize Migrations'),
-            0, 0,
-            self, 'flask_init_migrations')
-        self.migrateInitAct.setStatusTip(self.tr(
-            'Initialize support for database migrations'))
-        self.migrateInitAct.setWhatsThis(self.tr(
-            """<b>Initialize Migrations</b>"""
-            """<p>Initializes the support for database migrations to be"""
-            """ stored in the configured migrations directory.</p>"""
-        ))
-        self.migrateInitAct.triggered.connect(
-            self.__initMigrations)
+            self.tr("Initialize Migrations"),
+            self.tr("&Initialize Migrations"),
+            0,
+            0,
+            self,
+            "flask_init_migrations",
+        )
+        self.migrateInitAct.setStatusTip(
+            self.tr("Initialize support for database migrations")
+        )
+        self.migrateInitAct.setWhatsThis(
+            self.tr(
+                """<b>Initialize Migrations</b>"""
+                """<p>Initializes the support for database migrations to be"""
+                """ stored in the configured migrations directory.</p>"""
+            )
+        )
+        self.migrateInitAct.triggered.connect(self.__initMigrations)
         self.actions.append(self.migrateInitAct)
-        
+
         #########################################################
         ## action to create a new database migration
         #########################################################
-        
+
         self.migrateCreateAct = EricAction(
-            self.tr('Create Migration'),
-            self.tr('&Create Migration'),
-            0, 0,
-            self, 'flask_create_migration')
-        self.migrateCreateAct.setStatusTip(self.tr(
-            'Create a new migration for the current database'))
-        self.migrateCreateAct.setWhatsThis(self.tr(
-            """<b>Create Migration</b>"""
-            """<p>Creates a new migration for the current database"""
-            """ and stores it  in the configured migrations directory.</p>"""
-        ))
-        self.migrateCreateAct.triggered.connect(
-            self.__createMigration)
+            self.tr("Create Migration"),
+            self.tr("&Create Migration"),
+            0,
+            0,
+            self,
+            "flask_create_migration",
+        )
+        self.migrateCreateAct.setStatusTip(
+            self.tr("Create a new migration for the current database")
+        )
+        self.migrateCreateAct.setWhatsThis(
+            self.tr(
+                """<b>Create Migration</b>"""
+                """<p>Creates a new migration for the current database"""
+                """ and stores it  in the configured migrations directory.</p>"""
+            )
+        )
+        self.migrateCreateAct.triggered.connect(self.__createMigration)
         self.actions.append(self.migrateCreateAct)
-        
+
         #########################################################
         ## action to up- and downgrade a databse
         #########################################################
-        
+
         self.upgradeDatabaseAct = EricAction(
-            self.tr('Upgrade Database'),
-            self.tr('&Upgrade Database'),
-            0, 0,
-            self, 'flask_upgrade_database')
-        self.upgradeDatabaseAct.setStatusTip(self.tr(
-            'Upgrade the database to the current migration'))
-        self.upgradeDatabaseAct.setWhatsThis(self.tr(
-            """<b>Upgrade Database</b>"""
-            """<p>Upgrades the database to the current migration.</p>"""
-        ))
-        self.upgradeDatabaseAct.triggered.connect(
-            self.upgradeDatabase)
+            self.tr("Upgrade Database"),
+            self.tr("&Upgrade Database"),
+            0,
+            0,
+            self,
+            "flask_upgrade_database",
+        )
+        self.upgradeDatabaseAct.setStatusTip(
+            self.tr("Upgrade the database to the current migration")
+        )
+        self.upgradeDatabaseAct.setWhatsThis(
+            self.tr(
+                """<b>Upgrade Database</b>"""
+                """<p>Upgrades the database to the current migration.</p>"""
+            )
+        )
+        self.upgradeDatabaseAct.triggered.connect(self.upgradeDatabase)
         self.actions.append(self.upgradeDatabaseAct)
-        
+
         self.downgradeDatabaseAct = EricAction(
-            self.tr('Downgrade Database'),
-            self.tr('&Downgrade Database'),
-            0, 0,
-            self, 'flask_downgrade_database')
-        self.downgradeDatabaseAct.setStatusTip(self.tr(
-            'Downgrade the database to the previous version'))
-        self.downgradeDatabaseAct.setWhatsThis(self.tr(
-            """<b>Downgrade Database</b>"""
-            """<p>Downgrades the database to the previous version.</p>"""
-        ))
-        self.downgradeDatabaseAct.triggered.connect(
-            self.downgradeDatabase)
+            self.tr("Downgrade Database"),
+            self.tr("&Downgrade Database"),
+            0,
+            0,
+            self,
+            "flask_downgrade_database",
+        )
+        self.downgradeDatabaseAct.setStatusTip(
+            self.tr("Downgrade the database to the previous version")
+        )
+        self.downgradeDatabaseAct.setWhatsThis(
+            self.tr(
+                """<b>Downgrade Database</b>"""
+                """<p>Downgrades the database to the previous version.</p>"""
+            )
+        )
+        self.downgradeDatabaseAct.triggered.connect(self.downgradeDatabase)
         self.actions.append(self.downgradeDatabaseAct)
-        
+
         #########################################################
         ## actions to show migrations history information
         #########################################################
-        
+
         self.migrationSummaryAct = EricAction(
-            self.tr('Show Migrations Summary'),
-            self.tr('Show Migrations &Summary'),
-            0, 0,
-            self, 'flask_show_migrations_summary')
-        self.migrationSummaryAct.setStatusTip(self.tr(
-            'Show a summary of the created database migrations'))
-        self.migrationSummaryAct.setWhatsThis(self.tr(
-            """<b>Show Migrations Summary</b>"""
-            """<p>Shows a summary list of the created database"""
-            """ migrations.</p>"""
-        ))
-        self.migrationSummaryAct.triggered.connect(
-            self.__showMigrationsSummary)
+            self.tr("Show Migrations Summary"),
+            self.tr("Show Migrations &Summary"),
+            0,
+            0,
+            self,
+            "flask_show_migrations_summary",
+        )
+        self.migrationSummaryAct.setStatusTip(
+            self.tr("Show a summary of the created database migrations")
+        )
+        self.migrationSummaryAct.setWhatsThis(
+            self.tr(
+                """<b>Show Migrations Summary</b>"""
+                """<p>Shows a summary list of the created database"""
+                """ migrations.</p>"""
+            )
+        )
+        self.migrationSummaryAct.triggered.connect(self.__showMigrationsSummary)
         self.actions.append(self.migrationSummaryAct)
-        
+
         self.migrationHistoryAct = EricAction(
-            self.tr('Show Migrations History'),
-            self.tr('Show Migrations &History'),
-            0, 0,
-            self, 'flask_show_migrations_history')
-        self.migrationHistoryAct.setStatusTip(self.tr(
-            'Show the full history of the created database migrations'))
-        self.migrationHistoryAct.setWhatsThis(self.tr(
-            """<b>Show Migrations History</b>"""
-            """<p>Shows the full history of the created database"""
-            """ migrations.</p>"""
-        ))
-        self.migrationHistoryAct.triggered.connect(
-            self.__showMigrationsHistory)
+            self.tr("Show Migrations History"),
+            self.tr("Show Migrations &History"),
+            0,
+            0,
+            self,
+            "flask_show_migrations_history",
+        )
+        self.migrationHistoryAct.setStatusTip(
+            self.tr("Show the full history of the created database migrations")
+        )
+        self.migrationHistoryAct.setWhatsThis(
+            self.tr(
+                """<b>Show Migrations History</b>"""
+                """<p>Shows the full history of the created database"""
+                """ migrations.</p>"""
+            )
+        )
+        self.migrationHistoryAct.triggered.connect(self.__showMigrationsHistory)
         self.actions.append(self.migrationHistoryAct)
-    
+
     def initMenu(self):
         """
         Public method to initialize the flask-migrate menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("Database"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.migrateConfigAct)
         menu.addSeparator()
         menu.addAction(self.migrateInitAct)
@@ -235,84 +283,83 @@
         menu.addSeparator()
         menu.addAction(self.migrateAvailabilityAct)
         menu.addAction(self.migrateInstallAct)
-        
+
         return menu
-    
+
     def determineCapability(self):
         """
         Public method to determine the availability of flask-migrate.
         """
         available = (
             self.__project.getData("flask", "flask_migrate_available")
-            if self.__project.getData("flask", "flask_migrate_override") else
-            self.__flaskMigrateAvailable()
+            if self.__project.getData("flask", "flask_migrate_override")
+            else self.__flaskMigrateAvailable()
         )
         self.__project.setCapability("flask-migrate", available)
-        
+
         self.migrateInstallAct.setEnabled(not available)
-        
+
         for act in (
-            self.migrateConfigAct, self.migrateInitAct,
+            self.migrateConfigAct,
+            self.migrateInitAct,
             self.migrateCreateAct,
-            self.upgradeDatabaseAct, self.downgradeDatabaseAct,
-            self.migrationSummaryAct, self.migrationHistoryAct,
+            self.upgradeDatabaseAct,
+            self.downgradeDatabaseAct,
+            self.migrationSummaryAct,
+            self.migrationHistoryAct,
         ):
             act.setEnabled(available)
-    
+
     def __flaskMigrateAvailable(self):
         """
         Private method to check, if the 'flask-babel' package is available.
-        
+
         @return flag indicating the availability of 'flask-babel'
         @rtype bool
         """
         interpreter = self.__project.getVirtualenvInterpreter()
         if interpreter and Utilities.isinpath(interpreter):
             detector = os.path.join(
-                os.path.dirname(__file__), "FlaskMigrateDetector.py")
+                os.path.dirname(__file__), "FlaskMigrateDetector.py"
+            )
             proc = QProcess()
-            proc.setProcessChannelMode(
-                QProcess.ProcessChannelMode.MergedChannels)
+            proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
             proc.start(interpreter, [detector])
             finished = proc.waitForFinished(30000)
             if finished and proc.exitCode() == 0:
                 return True
-        
+
         return False
-    
+
     def __migrationsDirectory(self, abspath=False):
         """
         Private method to calculate the path of the configured migrations
         directory.
-        
+
         @param abspath flag indicating to return an absolute path
         @type bool
         @return path of the migrations directory
         @rtype str
         """
         migrations = ""
-        
+
         self.__ensureMigrateConfigured()
-        
-        migrations = self.__project.getData("flask-migrate",
-                                            "migrationsDirectory")
+
+        migrations = self.__project.getData("flask-migrate", "migrationsDirectory")
         if migrations:
             if abspath:
-                migrations = self.__ericProject.getAbsoluteUniversalPath(
-                    migrations)
+                migrations = self.__ericProject.getAbsoluteUniversalPath(migrations)
             else:
                 workdir = self.__project.getApplication()[0]
                 migrations = os.path.relpath(
-                    self.__ericProject.getAbsoluteUniversalPath(migrations),
-                    workdir
+                    self.__ericProject.getAbsoluteUniversalPath(migrations), workdir
                 )
         else:
             if abspath:
-                migrations = self.__ericProject.getAbsoluteUniversalPath(
-                    "migrations")
-        
+                migrations = self.__ericProject.getAbsoluteUniversalPath("migrations")
+
         return migrations
-    
+
     def projectClosed(self):
         """
         Public method to handle the closing of a project.
@@ -320,24 +367,24 @@
         for dlg in (self.__migrationSummaryDialog,):
             if dlg is not None:
                 dlg.close()
-    
+
     ########################################################
     ## Menu related slots below
     ########################################################
-    
+
     @pyqtSlot()
     def __configureMigrate(self):
         """
         Private slot to show a dialog to edit the migrate configuration.
         """
         from .MigrateConfigDialog import MigrateConfigDialog
-        
+
         config = self.__project.getData("flask-migrate", "")
         dlg = MigrateConfigDialog(config)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             config = dlg.getConfiguration()
             self.__project.setData("flask-migrate", "", config)
-    
+
     def __ensureMigrateConfigured(self):
         """
         Private method to ensure, that flask-migrate has been configured.
@@ -345,7 +392,7 @@
         config = self.__project.getData("flask-migrate", "")
         if not config:
             self.__configureMigrate()
-    
+
     @pyqtSlot()
     def __installFlaskMigrate(self):
         """
@@ -362,10 +409,13 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Install flask-migrate"),
-                self.tr("The 'flask-migrate' extension could not be installed"
-                        " because no virtual environment has been"
-                        " configured."))
-    
+                self.tr(
+                    "The 'flask-migrate' extension could not be installed"
+                    " because no virtual environment has been"
+                    " configured."
+                ),
+            )
+
     @pyqtSlot()
     def __checkAvailability(self):
         """
@@ -374,43 +424,43 @@
         self.determineCapability()
         msg = (
             self.tr("The 'flask-migrate' extension is installed.")
-            if self.__project.hasCapability("flask-migrate") else
-            self.tr("The 'flask-migrate' extension is not installed.")
+            if self.__project.hasCapability("flask-migrate")
+            else self.tr("The 'flask-migrate' extension is not installed.")
         )
-        EricMessageBox.information(
-            None,
-            self.tr("flask-migrate Availability"),
-            msg)
-    
+        EricMessageBox.information(None, self.tr("flask-migrate Availability"), msg)
+
     #########################################################
     ## slot to initialize the database migration system
     #########################################################
-    
+
     @pyqtSlot()
     def __initMigrations(self):
         """
         Private slot to initialize the database migration system.
         """
         title = self.tr("Initialize Migrations")
-        
+
         self.__ensureMigrateConfigured()
         migrations = self.__migrationsDirectory()
-        
+
         args = ["init"]
         if migrations:
             args += ["--directory", migrations]
-        
+
         multidb = EricMessageBox.yesNo(
             None,
             self.tr("Multiple Databases"),
-            self.tr("""Shall the support for multiple databases be"""
-                    """ activated?"""))
+            self.tr(
+                """Shall the support for multiple databases be""" """ activated?"""
+            ),
+        )
         if multidb:
             args.append("--multidb")
-        
+
         dlg = FlaskCommandDialog(
-            self.__project, title=title,
-            msgSuccess=self.tr("\nMigrations initialized successfully.")
+            self.__project,
+            title=title,
+            msgSuccess=self.tr("\nMigrations initialized successfully."),
         )
         if dlg.startCommand("db", args):
             dlg.exec()
@@ -421,144 +471,149 @@
                     for fileName in files:
                         fullName = os.path.join(root, fileName)
                         self.__ericProject.appendFile(fullName)
-                
-                browser = (ericApp().getObject("ProjectBrowser")
-                           .getProjectBrowser("others"))
+
+                browser = (
+                    ericApp().getObject("ProjectBrowser").getProjectBrowser("others")
+                )
                 alembic = os.path.join(
-                    self.__migrationsDirectory(abspath=True),
-                    "alembic.ini"
+                    self.__migrationsDirectory(abspath=True), "alembic.ini"
                 )
                 browser.sourceFile.emit(alembic)
-    
+
     #########################################################
     ## slot to create a new database migration
     #########################################################
-    
+
     @pyqtSlot()
     def __createMigration(self):
         """
         Private slot to create a new database migration.
         """
         title = self.tr("Create Migration")
-        
+
         self.__ensureMigrateConfigured()
         migrations = self.__migrationsDirectory()
-        
+
         message, ok = QInputDialog.getText(
             None,
             title,
             self.tr("Enter a short message for the migration:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok:
             args = ["migrate"]
             if migrations:
                 args += ["--directory", migrations]
             if message:
                 args += ["--message", message]
-            
+
             dlg = FlaskCommandDialog(
-                self.__project, title=title,
-                msgSuccess=self.tr("\nMigration created successfully.")
+                self.__project,
+                title=title,
+                msgSuccess=self.tr("\nMigration created successfully."),
             )
             if dlg.startCommand("db", args):
                 dlg.exec()
                 if dlg.normalExit():
                     versionsPattern = os.path.join(
-                        self.__migrationsDirectory(abspath=True),
-                        "versions", "*.py")
+                        self.__migrationsDirectory(abspath=True), "versions", "*.py"
+                    )
                     for fileName in glob.iglob(versionsPattern):
                         self.__ericProject.appendFile(fileName)
-    
+
     #########################################################
     ## slots to up- and downgrade a databse
     #########################################################
-    
+
     @pyqtSlot()
     def upgradeDatabase(self, revision=None):
         """
         Public slot to upgrade the database to the current migration.
-        
+
         @param revision migration revision to upgrade to
         @type str
         """
         title = self.tr("Upgrade Database")
-        
+
         self.__ensureMigrateConfigured()
         migrations = self.__migrationsDirectory()
-        
+
         args = ["upgrade"]
         if migrations:
             args += ["--directory", migrations]
         if revision:
             args.append(revision)
-        
+
         dlg = FlaskCommandDialog(
-            self.__project, title=title,
-            msgSuccess=self.tr("\nDatabase upgraded successfully.")
+            self.__project,
+            title=title,
+            msgSuccess=self.tr("\nDatabase upgraded successfully."),
         )
         if dlg.startCommand("db", args):
             dlg.exec()
-    
+
     @pyqtSlot()
     def downgradeDatabase(self, revision=None):
         """
         Public slot to downgrade the database to the previous version.
-        
+
         @param revision migration revision to downgrade to
         @type str
         """
         title = self.tr("Downgrade Database")
-        
+
         self.__ensureMigrateConfigured()
         migrations = self.__migrationsDirectory()
-        
+
         args = ["downgrade"]
         if migrations:
             args += ["--directory", migrations]
         if revision:
             args.append(revision)
-        
+
         dlg = FlaskCommandDialog(
-            self.__project, title=title,
-            msgSuccess=self.tr("\nDatabase downgraded successfully.")
+            self.__project,
+            title=title,
+            msgSuccess=self.tr("\nDatabase downgraded successfully."),
         )
         if dlg.startCommand("db", args):
             dlg.exec()
-    
+
     #########################################################
     ## slots to show migrations history information
     #########################################################
-    
+
     @pyqtSlot()
     def __showMigrationsSummary(self):
         """
         Private slot to show a migrations history summary.
         """
         from .MigrateSummaryDialog import MigrateSummaryDialog
-        
+
         self.__ensureMigrateConfigured()
         migrations = self.__migrationsDirectory()
-        
+
         if self.__migrationSummaryDialog is None:
             self.__migrationSummaryDialog = MigrateSummaryDialog(
-                self.__project, self, migrations=migrations)
-        
+                self.__project, self, migrations=migrations
+            )
+
         self.__migrationSummaryDialog.showSummary()
-    
+
     @pyqtSlot()
     def __showMigrationsHistory(self):
         """
         Private slot to show the full migrations history.
         """
         title = self.tr("Migrations History")
-        
+
         self.__ensureMigrateConfigured()
         migrations = self.__migrationsDirectory()
-        
+
         args = ["history", "--indicate-current", "--verbose"]
         if migrations:
             args += ["--directory", migrations]
-        
+
         dlg = FlaskCommandDialog(self.__project, title=title)
         if dlg.startCommand("db", args):
             dlg.exec()

eric ide

mercurial