← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/biblefixes into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/biblefixes into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)


A bunch of Bible fixes.
-- 
https://code.launchpad.net/~raoul-snyman/openlp/biblefixes/+merge/21815
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2010-03-18 21:36:30 +0000
+++ openlp/core/utils/__init__.py	2010-03-21 22:25:23 +0000
@@ -44,6 +44,12 @@
 
     @staticmethod
     def get_directory(dir_type):
+        """
+        Return the appropriate directory according to the directory type.
+
+        ``dir_type``
+            The directory type you want, for instance the data directory.
+        """
         if dir_type == AppLocation.AppDir:
             return os.path.abspath(os.path.split(sys.argv[0])[0])
         elif dir_type == AppLocation.ConfigDir:
@@ -89,6 +95,16 @@
 
 
 def check_latest_version(config, current_version):
+    """
+    Check the latest version of OpenLP against the version file on the OpenLP
+    site.
+
+    ``config``
+        The OpenLP config object.
+
+    ``current_version``
+        The current version of OpenLP.
+    """
     version_string = current_version
     #set to prod in the distribution confif file.
     last_test = config.get_config(u'last version test', datetime.now().date())
@@ -107,6 +123,18 @@
                 log.exception(u'Reason for failure: %s', e.reason)
     return version_string
 
+def variant_to_unicode(variant):
+    """
+    Converts a QVariant to a unicode string.
+
+    ``variant``
+        The QVariant instance to convert to unicode.
+    """
+    string = variant.toString()
+    if not isinstance(string, unicode):
+        string = unicode(string, u'utf8')
+    return string
+
 from registry import Registry
 from confighelper import ConfigHelper
 

=== modified file 'openlp/plugins/bibles/forms/importwizardform.py'
--- openlp/plugins/bibles/forms/importwizardform.py	2010-03-21 20:33:57 +0000
+++ openlp/plugins/bibles/forms/importwizardform.py	2010-03-21 22:25:23 +0000
@@ -32,7 +32,7 @@
 
 from bibleimportwizard import Ui_BibleImportWizard
 from openlp.core.lib import Receiver
-from openlp.core.utils import AppLocation
+from openlp.core.utils import AppLocation, variant_to_unicode
 from openlp.plugins.bibles.lib.manager import BibleFormat
 
 log = logging.getLogger(__name__)
@@ -60,9 +60,21 @@
     log.info(u'BibleImportForm loaded')
 
     def __init__(self, parent, config, manager, bibleplugin):
-        '''
-        Constructor
-        '''
+        """
+        Instantiate the wizard, and run any extra setup we need to.
+
+        ``parent``
+            The QWidget-derived parent of the wizard.
+
+        ``config``
+            The configuration object for storing and retrieving settings.
+
+        ``manager``
+            The Bible manager.
+
+        ``bibleplugin``
+            The Bible plugin.
+        """
         QtGui.QWizard.__init__(self, parent)
         self.setupUi(self)
         self.registerFields()
@@ -97,10 +109,16 @@
             self.onCurrentIdChanged)
 
     def exec_(self):
+        """
+        Run the wizard.
+        """
         self.setDefaults()
         return QtGui.QWizard.exec_(self)
 
     def validateCurrentPage(self):
+        """
+        Validate the current page before moving on to the next page.
+        """
         if self.currentId() == 0:
             # Welcome page
             return True
@@ -144,7 +162,9 @@
             return True
         elif self.currentId() == 2:
             # License details
-            if self.field(u'license_version').toString() == u'':
+            license_version = variant_to_unicode(self.field(u'license_version'))
+            license_copyright = variant_to_unicode(self.field(u'license_copyright'))
+            if license_version == u'':
                 QtGui.QMessageBox.critical(self,
                     self.trUtf8('Empty Version Name'),
                     self.trUtf8('You need to specify a version name for your '
@@ -152,7 +172,7 @@
                     QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
                 self.VersionNameEdit.setFocus()
                 return False
-            elif self.field(u'license_copyright').toString() == u'':
+            elif license_copyright == u'':
                 QtGui.QMessageBox.critical(self,
                     self.trUtf8('Empty Copyright'),
                     self.trUtf8('You need to set a copyright for your Bible! '
@@ -161,8 +181,7 @@
                     QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
                 self.CopyrightEdit.setFocus()
                 return False
-            elif self.manager.exists(
-                     self.field(u'license_version').toString()):
+            elif self.manager.exists(license_version):
                 QtGui.QMessageBox.critical(self,
                     self.trUtf8('Bible Exists'),
                     self.trUtf8('This Bible already exists! Please import '
@@ -176,27 +195,49 @@
             return True
 
     def onLocationComboBoxChanged(self, index):
+        """
+        Setup the list of Bibles when you select a different source on the web
+        download page.
+
+        ``index``
+            The index of the combo box.
+        """
         self.BibleComboBox.clear()
-        for bible, abbreviation in self.web_bible_list[index].iteritems():
+        for bible in self.web_bible_list[index].keys():
             self.BibleComboBox.addItem(unicode(self.trUtf8(bible)))
 
     def onOsisFileButtonClicked(self):
-        self.getFileName(self.trUtf8('Open OSIS file'),
+        """
+        Show the file open dialog for the OSIS file.
+        """
+        self.getFileName(self.trUtf8('Open OSIS File'),
             self.OSISLocationEdit)
 
     def onBooksFileButtonClicked(self):
-        self.getFileName(self.trUtf8('Open Books CSV file'),
+        """
+        Show the file open dialog for the books CSV file.
+        """
+        self.getFileName(self.trUtf8('Open Books CSV File'),
             self.BooksLocationEdit)
 
     def onCsvVersesFileButtonClicked(self):
-        self.getFileName(self.trUtf8('Open Verses CSV file'),
+        """
+        Show the file open dialog for the verses CSV file.
+        """
+        self.getFileName(self.trUtf8('Open Verses CSV File'),
             self.CsvVerseLocationEdit)
 
     def onOpenSongBrowseButtonClicked(self):
+        """
+        Show the file open dialog for the OpenSong file.
+        """
         self.getFileName(self.trUtf8('Open OpenSong Bible'),
             self.OpenSongFileEdit)
 
     def onCancelButtonClicked(self, checked):
+        """
+        Stop the import on pressing the cancel button.
+        """
         log.debug('Cancel button pressed!')
         if self.currentId() == 3:
             Receiver.send_message(u'openlpstopimport')
@@ -270,7 +311,7 @@
             books_reader = csv.reader(books_file, dialect)
             for line in books_reader:
                 self.web_bible_list[DownloadLocation.Crosswalk][line[0]] = \
-                    unicode(line[1], u'utf-8').strip()
+                    unicode(line[1], u'utf8').strip()
         except:
             log.exception(u'Crosswalk resources missing')
         finally:
@@ -315,25 +356,28 @@
 
     def performImport(self):
         bible_type = self.field(u'source_format').toInt()[0]
+        license_version = variant_to_unicode(self.field(u'license_version'))
+        license_copyright = variant_to_unicode(self.field(u'license_copyright'))
+        license_permission = variant_to_unicode(self.field(u'license_permission'))
         importer = None
         if bible_type == BibleFormat.OSIS:
             # Import an OSIS bible
             importer = self.manager.import_bible(BibleFormat.OSIS,
-                name=unicode(self.field(u'license_version').toString()),
-                filename=unicode(self.field(u'osis_location').toString())
+                name=license_version,
+                filename=variant_to_unicode(self.field(u'osis_location'))
             )
         elif bible_type == BibleFormat.CSV:
             # Import a CSV bible
             importer = self.manager.import_bible(BibleFormat.CSV,
-                name=unicode(self.field(u'license_version').toString()),
-                booksfile=self.field(u'csv_booksfile').toString(),
-                versefile=self.field(u'csv_versefile').toString()
+                name=license_version,
+                booksfile=variant_to_unicode(self.field(u'csv_booksfile')),
+                versefile=variant_to_unicode(self.field(u'csv_versefile'))
             )
         elif bible_type == BibleFormat.OpenSong:
             # Import an OpenSong bible
             importer = self.manager.import_bible(BibleFormat.OpenSong,
-                name=unicode(self.field(u'license_version').toString()),
-                filename=self.field(u'opensong_file').toString()
+                name=license_version,
+                filename=variant_to_unicode(self.field(u'opensong_file'))
             )
         elif bible_type == BibleFormat.WebDownload:
             # Import a bible from the web
@@ -344,23 +388,20 @@
                     unicode(self.BibleComboBox.currentText(), u'utf8')]
             elif download_location == DownloadLocation.BibleGateway:
                 bible = self.web_bible_list[DownloadLocation.BibleGateway][
-                    self.BibleComboBox.currentText()]
-            importer = self.manager.import_bible(BibleFormat.WebDownload,
-                name=unicode(self.field(u'license_version').toString(), u'utf8'),
+                    unicode(self.BibleComboBox.currentText(), u'utf8')]
+            importer = self.manager.import_bible(
+                BibleFormat.WebDownload,
+                name=license_version,
                 download_source=DownloadLocation.get_name(download_location),
                 download_name=bible,
-                proxy_server=unicode(self.field(u'proxy_server').toString(), u'utf8'),
-                proxy_username=unicode(self.field(u'proxy_username').toString(), u'utf8'),
-                proxy_password=unicode(self.field(u'proxy_password').toString(), u'utf8')
+                proxy_server=variant_to_unicode(self.field(u'proxy_server')),
+                proxy_username=variant_to_unicode(self.field(u'proxy_username')),
+                proxy_password=variant_to_unicode(self.field(u'proxy_password'))
             )
         success = importer.do_import()
         if success:
-            self.manager.save_meta_data(
-                unicode(self.field(u'license_version').toString()),
-                unicode(self.field(u'license_version').toString()),
-                unicode(self.field(u'license_copyright').toString()),
-                unicode(self.field(u'license_permission').toString())
-            )
+            self.manager.save_meta_data(license_version, license_version,
+                license_copyright, license_permission)
             self.manager.reload_bibles()
             self.ImportProgressLabel.setText(self.trUtf8('Finished import.'))
         else:

=== modified file 'openlp/plugins/bibles/lib/http.py'
--- openlp/plugins/bibles/lib/http.py	2010-03-21 14:38:30 +0000
+++ openlp/plugins/bibles/lib/http.py	2010-03-21 22:25:23 +0000
@@ -39,10 +39,19 @@
 log = logging.getLogger(__name__)
 
 class HTTPBooks(object):
+    """
+    A wrapper class around a small SQLite database which contains the books,
+    chapter counts and verse counts for the web download Bibles. This class
+    contains a singleton "cursor" so that only one connection to the SQLite
+    database is ever used.
+    """
     cursor = None
 
     @staticmethod
     def get_cursor():
+        """
+        Return the cursor object. Instantiate one if it doesn't exist yet.
+        """
         if HTTPBooks.cursor is None:
             filepath = os.path.join(
                 AppLocation.get_directory(AppLocation.PluginsDir), u'bibles',
@@ -53,12 +62,24 @@
 
     @staticmethod
     def run_sql(query, parameters=()):
+        """
+        Run an SQL query on the database, returning the results.
+
+        ``query``
+            The actual SQL query to run.
+
+        ``parameters``
+            Any variable parameters to add to the query.
+        """
         cursor = HTTPBooks.get_cursor()
         cursor.execute(query, parameters)
         return cursor.fetchall()
 
     @staticmethod
     def get_books():
+        """
+        Return a list of all the books of the Bible.
+        """
         books = HTTPBooks.run_sql(u'SELECT id, testament_id, name, '
                 u'abbreviation, chapters FROM books ORDER BY id')
         book_list = []
@@ -74,6 +95,12 @@
 
     @staticmethod
     def get_book(name):
+        """
+        Return a book by name or abbreviation.
+
+        ``name``
+            The name or abbreviation of the book.
+        """
         if not isinstance(name, unicode):
             name = unicode(name)
         books = HTTPBooks.run_sql(u'SELECT id, testament_id, name, '
@@ -92,6 +119,15 @@
 
     @staticmethod
     def get_chapter(name, chapter):
+        """
+        Return the chapter details for a specific chapter of a book.
+
+        ``name``
+            The name or abbreviation of a book.
+
+        ``chapter``
+            The chapter number.
+        """
         if not isinstance(name, int):
             chapter = int(chapter)
         book = HTTPBooks.get_book(name)
@@ -109,6 +145,12 @@
 
     @staticmethod
     def get_chapter_count(book):
+        """
+        Return the number of chapters in a book.
+
+        ``book``
+            The name or abbreviation of the book.
+        """
         details = HTTPBooks.get_book(book)
         if details:
             return details[u'chapters']
@@ -116,6 +158,15 @@
 
     @staticmethod
     def get_verse_count(book, chapter):
+        """
+        Return the number of verses in a chapter.
+
+        ``book``
+            The name or abbreviation of the book.
+
+        ``chapter``
+            The number of the chapter.
+        """
         details = HTTPBooks.get_chapter(book, chapter)
         if details:
             return details[u'verses']
@@ -123,7 +174,9 @@
 
 
 class BGExtract(BibleCommon):
-    log.info(u'%s BGExtract loaded', __name__)
+    """
+    Extract verses from BibleGateway
+    """
 
     def __init__(self, proxyurl=None):
         log.debug(u'init %s', proxyurl)
@@ -133,7 +186,7 @@
         """
         Access and decode bibles via the BibleGateway website
 
-        ``Version``
+        ``version``
             The version of the bible like 31 for New International version
 
         ``bookname``
@@ -196,8 +249,10 @@
                 verse_list[verse_number] = u''
                 continue
             if isinstance(verse, NavigableString):
+                if not isinstance(verse, unicode):
+                    verse = unicode(verse, u'utf8')
                 verse_list[verse_number] = verse_list[verse_number] + \
-                    unescape(unicode(verse, u'utf-8').replace(u' ', u' '))
+                    unescape(verse.replace(u' ', u' '))
         # Delete the "0" element, since we don't need it, it's just there for
         # some stupid initial whitespace, courtesy of Bible Gateway.
         del verse_list[0]
@@ -205,14 +260,15 @@
         return SearchResults(bookname, chapter, verse_list)
 
 class CWExtract(BibleCommon):
-    log.info(u'%s CWExtract loaded', __name__)
+    """
+    Extract verses from CrossWalk/BibleStudyTools
+    """
 
     def __init__(self, proxyurl=None):
         log.debug(u'init %s', proxyurl)
         self.proxyurl = proxyurl
 
     def get_bible_chapter(self, version, bookname, chapter):
-        log.debug(u'%s %s, %s, %s', __name__, version, bookname, chapter)
         """
         Access and decode bibles via the Crosswalk website
 
@@ -227,9 +283,9 @@
         """
         log.debug(u'get_bible_chapter %s,%s,%s',
             version, bookname, chapter)
-        bookname = bookname.replace(u' ', u'')
+        urlbookname = bookname.replace(u' ', u'-')
         chapter_url = u'http://www.biblestudytools.com/%s/%s/%s.html' % \
-            (version, bookname.lower(), chapter)
+            (version, urlbookname.lower(), chapter)
         log.debug(u'URL: %s', chapter_url)
         page = urllib2.urlopen(chapter_url)
         if not page:
@@ -287,6 +343,10 @@
             self.proxy_password = None
 
     def do_import(self):
+        """
+        Run the import. This method overrides the parent class method. Returns
+        ``True`` on success, ``False`` on failure.
+        """
         self.wizard.ImportProgressBar.setMaximum(2)
         self.wizard.incrementProgressBar('Registering bible...')
         self.create_meta(u'download source', self.download_source)
@@ -370,17 +430,43 @@
             return None
 
     def get_books(self):
+        """
+        Return the list of books.
+        """
         return [Book.populate(name=book['name']) for book in HTTPBooks.get_books()]
 
     def lookup_book(self, book):
+        """
+        Look up the name of a book.
+        """
         return HTTPBooks.get_book(book)
 
     def get_chapter_count(self, book):
+        """
+        Return the number of chapters in a particular book.
+        """
         return HTTPBooks.get_chapter_count(book)
 
     def get_verse_count(self, book, chapter):
+        """
+        Return the number of verses for the specified chapter and book.
+
+        ``book``
+            The name of the book.
+
+        ``chapter``
+            The chapter whose verses are being counted.
+        """
         return HTTPBooks.get_verse_count(book, chapter)
 
     def set_proxy_server(self, server):
+        """
+        Sets the proxy server.
+
+        **Note: This is not actually used.**
+
+        ``server``
+            The hostname or IP address of the proxy server.
+        """
         self.proxy_server = server
 

=== modified file 'openlp/plugins/bibles/lib/manager.py'
--- openlp/plugins/bibles/lib/manager.py	2010-03-19 22:08:06 +0000
+++ openlp/plugins/bibles/lib/manager.py	2010-03-21 22:25:23 +0000
@@ -60,6 +60,9 @@
     def get_class(id):
         """
         Return the appropriate imeplementation class.
+
+        ``id``
+            The Bible format.
         """
         if id == BibleFormat.OSIS:
             return OSISBible
@@ -74,6 +77,9 @@
 
     @staticmethod
     def list():
+        """
+        Return a list of the supported Bible formats.
+        """
         return [
             BibleFormat.OSIS,
             BibleFormat.CSV,
@@ -247,7 +253,7 @@
         """
         if not isinstance(name, unicode):
             name = unicode(name)
-        for bible, db_object in self.db_cache.iteritems():
+        for bible in self.db_cache.keys():
             log.debug(u'Bible from cache in is_new_bible %s', bible)
             if not isinstance(bible, unicode):
                 bible = unicode(bible)

=== modified file 'openlp/plugins/bibles/lib/osis.py'
--- openlp/plugins/bibles/lib/osis.py	2010-03-19 22:08:06 +0000
+++ openlp/plugins/bibles/lib/osis.py	2010-03-21 22:25:23 +0000
@@ -65,6 +65,7 @@
         self.l_regex = re.compile(r'<l (.*?)>')
         self.w_regex = re.compile(r'<w (.*?)>')
         self.q_regex = re.compile(r'<q (.*?)>')
+        self.trans_regex = re.compile(r'<transChange(.*?)>(.*?)</transChange>')
         self.spaces_regex = re.compile(r'([ ]{2,})')
         self.books = {}
         filepath = os.path.join(
@@ -159,10 +160,11 @@
                     verse_text = self.l_regex.sub(u'', verse_text)
                     verse_text = self.w_regex.sub(u'', verse_text)
                     verse_text = self.q_regex.sub(u'', verse_text)
+                    verse_text = self.trans_regex.sub(u'', verse_text)
                     verse_text = verse_text.replace(u'</lb>', u'')\
                         .replace(u'</l>', u'').replace(u'<lg>', u'')\
                         .replace(u'</lg>', u'').replace(u'</q>', u'')\
-                        .replace(u'</div>', u'')
+                        .replace(u'</div>', u'').replace(u'</w>',  u'')
                     verse_text = self.spaces_regex.sub(u' ', verse_text)
                     self.create_verse(db_book.id, chapter, verse, verse_text)
                     Receiver.send_message(u'process_events')


Follow ups